在之前的asp.net版本中,我们可以使用
。@Request.Url.AbsoluteUri
但它似乎已经改变了。我们如何在asp.net core 1.0中做到这一点?
在之前的asp.net版本中,我们可以使用
。@Request.Url.AbsoluteUri
但它似乎已经改变了。我们如何在asp.net core 1.0中做到这一点?
你需要分别获取主机名和路径。
@Context.Request.Host
@Context.Request.Path
@HttpContext
而不是 @Context
。对于局部视图,@Context
可以工作。我是否忘记了一个 using 引用? - AndriodUrl.Action("Action", null, null, Request.Url.Scheme);
参考自:https://dev59.com/MXRC5IYBdhLWcg3wCMc6 - DanRequest.QueryString
,因为 Request.Path
不包括查询字符串。 - Menol你需要方案、主机、路径和查询字符串。
@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}")
Request
的扩展方法:Request.GetDisplayUrl()
@using Microsoft.AspNetCore.Http.Extensions
,然后使用 @Context.Request.GetDisplayUrl()
,这将起作用。 - Serj Sagan显然,使用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。
使用 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。
@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¶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
从 Razor 页面或 PageModel 类中获取当前 URL 的清晰方法是:
Url.PageLink()
请注意,我的意思是 "ASP.NET Core Razor Pages",而不是MVC。接受的答案对我有帮助,来自@padigan的评论也有帮助,但如果您想像我一样包括查询字符串参数,则尝试以下操作:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
你需要在视图中添加 @using Microsoft.AspNetCore.Http.Extensions
,这样 GetEncodedPathAndQuery() 方法才能使用。
Request.Host
属性来访问它。
Request.Host
属性不仅仅是一个字符串,而是一个包含主机域名和端口号的对象。如果端口号在URL中明确指定(例如:"https://example.com:8080/path/to/resource"
),那么调用Request.Host
将会给你主机域名和端口号,如下所示:"example.com:8080"
。Request.Host.Host
或Request.Host.Port
)。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