如何在 asp.net 核心 1.0 中获取当前 url
How to get current url in view in asp.net core 1.0
在 asp.net 的早期版本中,我们可以使用
@Request.Url.AbsoluteUri
不过好像变了。我们如何在 asp.net 核心 1.0 中做到这一点?
你必须分别获取主机和路径。
@Context.Request.Host
@Context.Request.Path
您需要方案、主机、路径和查询字符串
@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)
或使用新的 C#6 功能 "String interpolation"
@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")
使用 Uri 的 AbsoluteUri 属性,使用 .Net 核心你必须像这样从请求构建 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”,这将 return 相同 url。
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);
}
可以使用Request
的扩展方法:
Request.GetDisplayUrl()
如果您还希望从请求中获取 端口号,您需要通过 Request.Host
属性 对于 AspNet Core。
Request.Host
属性 不仅仅是一个字符串,而是一个包含主机域 和 端口号的对象。如果端口号在URL(即"https://example.com:8080/path/to/resource"
)中具体写出,那么调用Request.Host
会给你主机域和端口像这样的数字:"example.com:8080"
.
如果您只需要主机域的值或只需要端口号的值,那么您可以单独访问这些属性(即 Request.Host.Host
或 Request.Host.Port
)。
这在 .net core 1.0 中显然总是可行的 Microsoft.AspNetCore.Http.Extensions
,它向 HttpRequest
添加了扩展以获得完整的 URL; GetEncodedUrl.
例如从剃刀角度来看:
@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>
从2.0开始,也有相对路径和查询GetEncodedPathAndQuery.
你可以考虑使用这个扩展方法(来自Microsoft.AspNetCore.Http.Extensions
命名空间:
@Context.Request.GetDisplayUrl()
对于我的一些项目,我更喜欢更灵活的解决方案。有两种扩展方法。
1) 第一种方法根据传入的请求数据创建 Uri
对象(通过可选参数有一些变体)。
2) 第二种方法接收 Uri
对象和 returns 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¶m2=b
Request.GetUri(addQuery: false);
//after >> https://localhost:44304/information/about
//before >> https://localhost:44304/information/about?param1=a¶m2=b
new Uri("https://localhost:44304/information/about?param1=a¶m2=b").GetHostWithNoSlash();
//after >> https://localhost:44304
接受的答案对我有帮助,@padigan 对它的评论也对我有帮助,但如果你想像我一样包含查询字符串参数,那么试试这个:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
您需要在视图中添加 @using Microsoft.AspNetCore.Http.Extensions
才能使用 GetEncodedPathAndQuery() 方法。
有一种简洁的方法可以从 Razor 页面或 PageModel class 获取当前 URL。即:
Url.PageLink()
请注意,我的意思是“ASP.NET Core Razor Pages”,而不是 MVC。
我想在 ASP.NET Core razor 页面中打印规范的 URL 元标记时使用此方法。但是有一个问题!它会给你 URL 应该是该页面的正确 URL。让我解释一下。
比如说,您已经为您的页面定义了一个名为“id”的路由,因此,您的 URL 应该看起来像
http://example.com/product?id=34
Url.PageLink() 将为您提供如上所示的 URL。
现在,如果用户在 URL 上添加任何额外内容,比如说,
http://example.com/product?id=34&somethingElse
那么,您将不会从此方法中得到“somethingElse”。这就是为什么它非常适合在 HTML 页面中打印规范 URL 元标记。
var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}{Context.Request.QueryString}";
在 asp.net 的早期版本中,我们可以使用
@Request.Url.AbsoluteUri
不过好像变了。我们如何在 asp.net 核心 1.0 中做到这一点?
你必须分别获取主机和路径。
@Context.Request.Host
@Context.Request.Path
您需要方案、主机、路径和查询字符串
@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)
或使用新的 C#6 功能 "String interpolation"
@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")
使用 Uri 的 AbsoluteUri 属性,使用 .Net 核心你必须像这样从请求构建 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”,这将 return 相同 url。
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);
}
可以使用Request
的扩展方法:
Request.GetDisplayUrl()
如果您还希望从请求中获取 端口号,您需要通过 Request.Host
属性 对于 AspNet Core。
Request.Host
属性 不仅仅是一个字符串,而是一个包含主机域 和 端口号的对象。如果端口号在URL(即"https://example.com:8080/path/to/resource"
)中具体写出,那么调用Request.Host
会给你主机域和端口像这样的数字:"example.com:8080"
.
如果您只需要主机域的值或只需要端口号的值,那么您可以单独访问这些属性(即 Request.Host.Host
或 Request.Host.Port
)。
这在 .net core 1.0 中显然总是可行的 Microsoft.AspNetCore.Http.Extensions
,它向 HttpRequest
添加了扩展以获得完整的 URL; GetEncodedUrl.
例如从剃刀角度来看:
@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>
从2.0开始,也有相对路径和查询GetEncodedPathAndQuery.
你可以考虑使用这个扩展方法(来自Microsoft.AspNetCore.Http.Extensions
命名空间:
@Context.Request.GetDisplayUrl()
对于我的一些项目,我更喜欢更灵活的解决方案。有两种扩展方法。
1) 第一种方法根据传入的请求数据创建 Uri
对象(通过可选参数有一些变体)。
2) 第二种方法接收 Uri
对象和 returns 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¶m2=b
Request.GetUri(addQuery: false);
//after >> https://localhost:44304/information/about
//before >> https://localhost:44304/information/about?param1=a¶m2=b
new Uri("https://localhost:44304/information/about?param1=a¶m2=b").GetHostWithNoSlash();
//after >> https://localhost:44304
接受的答案对我有帮助,@padigan 对它的评论也对我有帮助,但如果你想像我一样包含查询字符串参数,那么试试这个:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
您需要在视图中添加 @using Microsoft.AspNetCore.Http.Extensions
才能使用 GetEncodedPathAndQuery() 方法。
有一种简洁的方法可以从 Razor 页面或 PageModel class 获取当前 URL。即:
Url.PageLink()
请注意,我的意思是“ASP.NET Core Razor Pages”,而不是 MVC。
我想在 ASP.NET Core razor 页面中打印规范的 URL 元标记时使用此方法。但是有一个问题!它会给你 URL 应该是该页面的正确 URL。让我解释一下。
比如说,您已经为您的页面定义了一个名为“id”的路由,因此,您的 URL 应该看起来像
http://example.com/product?id=34
Url.PageLink() 将为您提供如上所示的 URL。
现在,如果用户在 URL 上添加任何额外内容,比如说,
http://example.com/product?id=34&somethingElse
那么,您将不会从此方法中得到“somethingElse”。这就是为什么它非常适合在 HTML 页面中打印规范 URL 元标记。
var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}{Context.Request.QueryString}";