如何在MVC 3中获取当前页面的URL

我正在使用我正在构build的博客上的Facebook评论插件。 它有一些FBXML标签,由页面上引用的facebook javascript解释。

这一切工作正常,但我必须将当前,完全合格的URL传递给插件。

<div style="width: 900px; margin: auto;"> <div id="fb-root"></div> <fb:comments href="URL HERE" num_posts="10" width="900"></fb:comments> </div> 

获取当前页面的URL的最佳方式是什么? 请求url。

这里是我的解决scheme的最终代码:

 <fb:comments href="@Request.Url.AbsoluteUri" num_posts="15" width="900"></fb:comments> 

您可以使用Request.RawUrlRequest.Url.OriginalStringRequest.Url.ToString()Request.Url.AbsoluteUri

将此扩展方法添加到您的代码中:

 public static Uri UrlOriginal(this HttpRequestBase request) { string hostHeader = request.Headers["host"]; return new Uri(string.Format("{0}://{1}{2}", request.Url.Scheme, hostHeader, request.RawUrl)); } 

然后你可以从RequestContext.HttpContext.Request属性中执行它。

在Asp.Net中有一个错误(可以是旁观的,见下文),这个错误是在本地网站使用端口80以外的端口的机器上出现的(如果内部网站是通过负载均衡虚拟IP而端口在内部用于发布规则),即使原始请求不使用它,Asp.Net也会始终将端口添加到AbsoluteUri属性中。

这段代码确保返回的url总是等于浏览器最初请求的Url(包括端口 – 因为它将被包含在主机头中),在任何负载平衡之前发生。

至less,它在我们(相当复杂!)的环境:)

如果在重写主机头之间有任何时髦的代理,那么这也不起作用。

2013年7月30日更新

正如@KevinJones在下面的评论中提到的那样 – 我在下一节中提到的设置已经在这里被logging: http : //msdn.microsoft.com/en-us/library/hh975440.aspx

虽然我不得不说,当我尝试时,我不能得到它的工作 – 但是这可能只是我犯了一个错字或什么东西。

2012年7月9日更新

我刚才偶然发现了这个问题,并且意在更新这个答案,但从来没有这样做。 当这个答案刚刚出现时,我想我应该现在就做。

我在Asp.Net中提到的'错误'可以通过一个明显没有logging的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 */ ... 

我个人并没有使用它 – 这是无证的,所以不能保证坚持 – 但是它可能会做同样的事情,我上面提到。 为了提高search结果的相关性 – 并且承认其他人看来已经发现了这一点,Nick 'aspnet:UseHostHeaderForRequest'也提到了'aspnet:UseHostHeaderForRequest'设置

 public static string GetCurrentWebsiteRoot() { return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); } 
  Request.Url.PathAndQuery 

应该完美的工作,特别是如果你只想要相对Uri(但保持querystrings)

我也是因为Facebook的原因才想到这个,到目前为止所给出的答案都没有按需要,或者太复杂了。

 @Request.Url.GetLeftPart(UriPartial.Path) 

获取完整的协议,主机和path“没有”查询string。 还包括端口,如果您使用的是默认的80以外的东西。

我的最爱…

 Url.Content(Request.Url.PathAndQuery) 

要不就…

 Url.Action() 

有一件事在其他答案中没有提及的是大小写敏感性,如果它将在多个地方被引用(它不是在原始问题中,但值得考虑,因为这个问题出现在很多类似的search)。 根据其他答案,我发现以下工作对我来说最初:

Request.Url.AbsoluteUri.ToString()

但为了更可靠,这成为了:

Request.Url.AbsoluteUri.ToString().ToLower()

然后根据我的要求(检查访问哪个域名并显示相关内容):

Request.Url.AbsoluteUri.ToString().ToLower().Contains("xxxx")

对我来说,问题是当我尝试访问HTTPContext的控制器的构造函数,而HTTPContext尚未就绪。 当在索引方法中移动它的工作:

  var uri = new Uri(Request.Url.AbsoluteUri); url = uri.Scheme + "://" + uri.Host + "/";enter code here