在ASP.NET Core 1.0中如何在视图中获取当前URL

157

在之前的asp.net版本中,我们可以使用

@Request.Url.AbsoluteUri

但它似乎已经改变了。我们如何在asp.net core 1.0中做到这一点?


2
像这样吗?https://dev59.com/J14c5IYBdhLWcg3wQoc5 - DavidG
6
看起来你现在可以使用UriHelper.GetDisplayUrl(Request)。 - Mark G
13个回答

182

你需要分别获取主机名和路径。

 @Context.Request.Host
 @Context.Request.Path

28
如果您的应用程序位于虚拟目录中,这将无法报告正确的URL。如果有虚拟目录,您需要在Request.Path值前加上Request.PathBase值。这也适用于几乎所有其他回答此问题的情况。 - padigan
3
这是 Razor 视图语法。 - jack.pop
3
对于 Razor 页面,我必须使用 @HttpContext 而不是 @Context。对于局部视图,@Context 可以工作。我是否忘记了一个 using 引用? - Andriod
3
在MVC中,有一种简单的方法可以获取绝对URL链接: Url.Action("Action", null, null, Request.Url.Scheme); 参考自:https://dev59.com/MXRC5IYBdhLWcg3wCMc6 - Dan
2
你需要在末尾添加 Request.QueryString,因为 Request.Path 不包括查询字符串。 - Menol
显示剩余2条评论

149

你需要方案、主机、路径和查询字符串。

@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)

或使用新的 C#6 功能“字符串插值”

@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")

1
你如何获取片段,比如http://test.com/abc#123,如何从请求中获取#123片段? - Ray
6
你做不到。浏览器不会将URI片段发送到服务器。 - tmg
考虑使用 UriBuilder 来构建 URL。 - Erik Philips

122
你可以使用Request的扩展方法:
Request.GetDisplayUrl()

46
如果您添加 @using Microsoft.AspNetCore.Http.Extensions,然后使用 @Context.Request.GetDisplayUrl(),这将起作用。 - Serj Sagan
2
仍然出现 - 请求在当前上下文中不存在 - SeanMC
2
请记住,此函数的智能感知摘要显示“仅适用于显示。此格式不应在HTTP标头或其他HTTP操作中使用。” 基于此,我认为@tmg的解决方案是最好的(可能包装在您自己的扩展方法中)。 - Gordon Glas
如果您想将其转换为与之前相同类型的Url对象,可以在获取显示URL后执行以下操作:var uri = new Uri(displayUrl); - rdans

24

显然,使用Microsoft.AspNetCore.Http.Extensions,在.net core 1.0中一直可以实现,它为HttpRequest添加了扩展以获取完整的URL; GetEncodedUrl

例如,在razor视图中:

@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>

从2.0版本开始,还有相对路径和查询GetEncodedPathAndQuery


感谢您包含 @using 语句。 - quemeful

19

使用 Uri 的 AbsoluteUri 属性。在 .Net Core 中,您需要像这样从请求构建 Uri:

 var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");

 var url = location.AbsoluteUri;

例如,如果请求的URL为'http://www.contoso.com/catalog/shownew.htm?date=today',则此函数将返回相同的URL。


12
像这样的事情让我觉得 .Net Core 在某些方面是一步退步。这种方式比起在 Asp.Net 中使用的 Request.Url,有什么我无法想象到的优点吗? - Soenhay

12
你可以考虑使用这个扩展方法(来自Microsoft.AspNetCore.Http.Extensions命名空间):
@Context.Request.GetDisplayUrl()

对于我的某些项目,我更喜欢更灵活的解决方案。有两种扩展方法。

1)第一种方法从传入的请求数据(通过可选参数进行一些变体)创建Uri对象。 2)第二种方法接收Uri对象并以以下格式返回string(无尾随斜杠):Scheme_Host_Port。

public static Uri GetUri(this HttpRequest request, bool addPath = true, bool addQuery = true)
    {
        var uriBuilder = new UriBuilder
        {
            Scheme = request.Scheme,
            Host = request.Host.Host,
            Port = request.Host.Port.GetValueOrDefault(80),
            Path = addPath ? request.Path.ToString() : default(string),
            Query = addQuery ? request.QueryString.ToString() : default(string)
        };
        return uriBuilder.Uri;
    }

    public static string HostWithNoSlash(this Uri uri)
    {
        return uri.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped);
    }

使用方法:

//before >> https://localhost:44304/information/about?param1=a&param2=b
        Request.GetUri(addQuery: false);
        //after >> https://localhost:44304/information/about

        //before >> https://localhost:44304/information/about?param1=a&param2=b
        new Uri("https://localhost:44304/information/about?param1=a&param2=b").GetHostWithNoSlash();
        //after >> https://localhost:44304

11

从 Razor 页面或 PageModel 类中获取当前 URL 的清晰方法是:

Url.PageLink()
请注意,我的意思是 "ASP.NET Core Razor Pages",而不是MVC。
我在ASP.NET Core Razor页面中想要打印规范的URL meta标签时使用此方法。但需要注意的是,它只会提供该页面正确URL。假设你为网页定义了一个名为“id”的路由,那么你的URL应该像这样:
http://example.com/product?id=34
Url.PageLink()将会返回上述URL。但是如果用户在URL上添加了额外的内容,例如:
http://example.com/product?id=34&somethingElse 那么,该方法将无法获取到“somethingElse”。 这正是在HTML页面中打印规范的URL meta标签所需的特性。

到目前为止最干净的! - Salih Kavaf

9

接受的答案对我有帮助,来自@padigan的评论也有帮助,但如果您想像我一样包括查询字符串参数,则尝试以下操作:

@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()

你需要在视图中添加 @using Microsoft.AspNetCore.Http.Extensions,这样 GetEncodedPathAndQuery() 方法才能使用。


8
如果你想从请求中获取端口号,你需要通过AspNet Core的Request.Host属性来访问它。 Request.Host属性不仅仅是一个字符串,而是一个包含主机域名和端口号的对象。如果端口号在URL中明确指定(例如:"https://example.com:8080/path/to/resource"),那么调用Request.Host将会给你主机域名和端口号,如下所示:"example.com:8080"
如果你只想要主机域名或端口号的值,那么你可以分别访问这些属性(例如:Request.Host.HostRequest.Host.Port)。

8
public string BuildAbsolute(PathString path, QueryString query = default(QueryString), FragmentString fragment = default(FragmentString))
{
    var rq = httpContext.Request;
    return Microsoft.AspNetCore.Http.Extensions.UriHelper.BuildAbsolute(rq.Scheme, rq.Host, rq.PathBase, path, query, fragment);
}

但是你从哪里获取 httpContext?这不适用于 Microsoft.AspNetCore.Http.HttpContext.Request - Tom Stickel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接