如何在 MVC 3 中获取当前页面 URL
Posted
技术标签:
【中文标题】如何在 MVC 3 中获取当前页面 URL【英文标题】:How to get current page URL in MVC 3 【发布时间】:2011-07-15 08:33:16 【问题描述】:我正在构建的博客上使用 Facebook cmets 插件。它有一些 FBXML 标记,这些标记由页面上引用的 facebook javascript 解释。
这一切都很好,但我必须将当前的、完全限定的 URL 传递给插件。
<div style="width: 900px; margin: auto;">
<div id="fb-root"></div>
<fb:comments href="URL HERE" num_posts="10" ></fb:comments>
</div>
获取当前页面 URL 的最佳方法是什么?请求网址。
解决方案
这是我的解决方案的最终代码:
<fb:comments href="@Request.Url.AbsoluteUri" num_posts="15" ></fb:comments>
【问题讨论】:
【参考方案1】:这对我来说适用于 Core 3.0 的完整 URL:
$"Request.Scheme://Request.Host.ValueRequest.Path.Value"
【讨论】:
【参考方案2】:浏览器历史的案例(单页样式)
HttpContext.Request.UrlReferrer
【讨论】:
【参考方案3】:对我来说,问题是当我尝试在 Controller 的构造函数中访问 HTTPContext
而 HTTPContext
尚未准备好时。在 Index 方法中移动时,它起作用了:
var uri = new Uri(Request.Url.AbsoluteUri);
url = uri.Scheme + "://" + uri.Host + "/";enter code here
【讨论】:
【参考方案4】:我最喜欢的...
Url.Content(Request.Url.PathAndQuery)
或者只是……
Url.Action()
【讨论】:
Url.Action() 只提供url的右侧,如果需要完整的url怎么办?【参考方案5】:其他答案中没有提到的一件事是区分大小写,如果要在多个地方引用它(它不在原始问题中,但值得考虑,因为这个问题出现在很多地方类似的搜索)。根据其他答案,我发现以下内容最初对我有用:
Request.Url.AbsoluteUri.ToString()
但为了更可靠,这变成了:
Request.Url.AbsoluteUri.ToString().ToLower()
然后根据我的要求(检查网站正在从哪个域名访问并显示相关内容):
Request.Url.AbsoluteUri.ToString().ToLower().Contains("xxxx")
【讨论】:
这并不能让它“更可靠”。小写是否有用完全取决于您实际尝试做什么,以及为什么区分大小写在那里有意义。通常您确实希望 URL 区分大小写。 @CodeCaster 是的,“更可靠”这个词是基于我自己的经验,因为我绝对不希望 URL 区分大小写,因为它会给客户带来无穷无尽的问题。【参考方案6】:public static string GetCurrentWebsiteRoot()
return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
【讨论】:
【参考方案7】:出于 Facebook 的原因,我也在寻找这个,但到目前为止给出的答案都没有满足需要或过于复杂。
@Request.Url.GetLeftPart(UriPartial.Path)
获取“不带”查询字符串的完整协议、主机和路径。如果您使用的不是默认的 80,还包括端口。
【讨论】:
很棒的发现!我怀疑这在询问时不存在?我觉得我会看到的:) 我以为我看到了刚刚添加的位置,但我刚刚检查了一下,似乎它自 .NET 1.1 以来就一直存在。谁知道呢。【参考方案8】:Request.Url.PathAndQuery
应该可以完美运行,尤其是如果您只想要相对 Uri(但保留查询字符串)
【讨论】:
【参考方案9】:您可以使用Request.RawUrl
、Request.Url.OriginalString
、Request.Url.ToString()
或Request.Url.AbsoluteUri
。
【讨论】:
由于某种原因,这似乎没有得到整个 URL,只是域之后的所有内容。 @Chevex,Request.Url.ToString()
或 Request.Url.AbsoluteUri
怎么样?
差不多。 Request.Url.AbsoluteUri
做到了:)
@Chevex - 网站托管在哪个端口上?如果是 80 端口,是的,你不会看到一个。我是说,在一个环境中,有一个虚拟 IP 将端口 80 发布到一个或多台机器上的 不同 端口(例如 81),那么 Asp.Net 总是会错误地将 :81 添加到 Url
要获取不同 url 片段的示例,请查看:cambiaresearch.com/articles/53/…【参考方案10】:
将此扩展方法添加到您的代码中:
public static Uri UrlOriginal(this HttpRequestBase request)
string hostHeader = request.Headers["host"];
return new Uri(string.Format("0://12",
request.Url.Scheme,
hostHeader,
request.RawUrl));
然后你可以从RequestContext.HttpContext.Request
属性中执行它。
Asp.Net 中存在一个错误(可以避开,见下文),该错误出现在使用端口 80 以外的端口用于本地网站的机器上(如果内部网站通过负载平衡发布,这是一个大问题虚拟 IP 和端口在内部用于发布规则),因此 Asp.Net总是在 AbsoluteUri
属性上添加端口 - 即使原始请求不使用它。
此代码确保在任何负载平衡等发生之前,返回的 url 始终等于浏览器最初请求的 Url(包括端口 - 因为它将包含在主机标头中) .
至少,它在我们的(相当复杂的!)环境中是这样的:)
如果在重写主机标头之间有任何时髦的代理,那么这也不起作用。
2013 年 7 月 30 日更新
正如@KevinJones 在下面的 cmets 中提到的 - 我在下一节中提到的设置已在此处记录:http://msdn.microsoft.com/en-us/library/hh975440.aspx
虽然我不得不说我在尝试时无法让它工作 - 但这可能只是我打错字或什么的。
2012 年 7 月 9 日更新
我不久前遇到了这个问题,并打算更新这个答案,但从未更新过。当有人对此答案投赞成票时,我想我现在应该这样做。
我在 Asp.Net 中提到的“错误”可以通过一个明显未记录的 appSettings 值来控制 - 称为 'aspnet:UseHostHeaderForRequest'
- 即:
<appSettings>
<add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>
我在查看 ILSpy 中的 HttpRequest.Url
时遇到了这个问题 - 由该 ILSpy 视图中的以下复制/粘贴左侧的 --->
指示:
public Uri Url
get
if (this._url == null && this._wr != null)
string text = this.QueryStringText;
if (!string.IsNullOrEmpty(text))
text = "?" + HttpEncoder.CollapsePercentUFromStringInternal(text,
this.QueryStringEncoding);
---> if (AppSettings.UseHostHeaderForRequestUrl)
string knownRequestHeader = this._wr.GetKnownRequestHeader(28);
try
if (!string.IsNullOrEmpty(knownRequestHeader))
this._url = new Uri(string.Concat(new string[]
this._wr.GetProtocol(),
"://",
knownRequestHeader,
this.Path,
text
));
catch (UriFormatException)
if (this._url == null) /* build from server name and port */
...
我个人没有使用过它——它没有记录,因此不能保证会继续存在——但它可能会做我上面提到的同样的事情。为了提高搜索结果的相关性 - 并感谢其他似乎发现了这一点的人 - the 'aspnet:UseHostHeaderForRequest'
setting has also been mentioned by Nick Aceves on Twitter
【讨论】:
好的,例如,如果您没有直接在控制器中使用代码,那么您在哪里或如何获得 HttpRequestBase 的 man 实例? @CoffeeAddict 好吧,在 mvc3 中你有 HttpContext.Current.Request,因为 Asp.net 4 使用基本抽象。如果在 .net 3.5 或更低版本上,您可以在 System.Web.Abstractions 中的同一属性周围使用 HttpRequestWrapper 这很晚,但 UseHostHeaderForRequestUrl 记录在这里msdn.microsoft.com/en-us/library/hh975440.aspx 好地方!至少他们最终将它添加到 4.5 文档中!以上是关于如何在 MVC 3 中获取当前页面 URL的主要内容,如果未能解决你的问题,请参考以下文章