How to get current page URL in MVC 3
我正在建立一个博客上使用Facebook评论插件。它有一些fbxml标记,由页面上引用的facebook javascript解释。
这一切都很好,但我必须将当前完全合格的URL传递给插件。
1 | <fb:comments href="URL HERE" num_posts="10" width="900"></fb:comments> |
获取当前页面的URL的最佳方法是什么?请求URL。
解决方案下面是我的解决方案的最终代码:
1 | <fb:comments href="@Request.Url.AbsoluteUri" num_posts="15" width="900"></fb:comments> |
型
您可以使用
型
将此扩展方法添加到代码中:
1 2 3 4 5 6 7 8 9 | 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)); } |
然后你可以从
ASP.NET中存在一个错误(可以是侧移的,请参阅下面),该错误出现在使用端口80以外的本地网站端口的计算机上(如果内部网站是通过虚拟IP上的负载平衡发布的,并且端口在内部用于发布规则,则是一个大问题),因此ASP.NET将始终在
此代码确保在进行任何负载平衡等操作之前,返回的URL始终等于浏览器最初请求的URL(包括端口,因为它将包含在主机头中)。
至少,它在我们的(相当复杂!)环境:)
如果在重写主机头的过程中有任何奇怪的代理,那么这也不会起作用。
2013年7月30日更新
正如@kevinjones在下面的评论中提到的-我在下一节中提到的设置已经记录在这里:http://msdn.microsoft.com/en-us/library/hh975440.aspx
虽然我不得不说,当我尝试的时候,我不能让它工作-但那可能只是我做了一个打字错误或什么。
2012年7月9日更新
不久前我遇到了这个问题,我想更新这个答案,但从来没有。当一个赞成票刚刚进入这个答案时,我想我应该现在就做。
我在ASP.NET中提到的"bug"可以通过一个明显未记录的appsettings值(称为
1 | </appSettings> |
号
我是在看iLSpy中的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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 */ ... |
我个人还没有使用过它——它是没有文件的,因此不能保证会一直使用——但是它可能会做和我上面提到的一样的事情。为了提高搜索结果的相关性,并确认其他人发现了这一点,nick aceves在twitter上也提到了
型
1 2 3 4 | public static string GetCurrentWebsiteRoot() { return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); } |
。
型
1 | Request.Url.PathAndQuery |
应该可以很好地工作,特别是如果您只需要相对的URI(但保留querystrings)
型
我也是出于facebook的原因来寻找这个问题的,目前给出的答案都没有根据需要有效,也没有太复杂的。
1 | @Request.Url.GetLeftPart(UriPartial.Path) |
。
获取完整的协议、主机和路径"without"querystring。如果您使用的不是默认80,还包括端口。
型
我最喜欢的…
1 | Url.Content(Request.Url.PathAndQuery) |
。
或者只是…
1 | Url.Action() |
型
对我来说,问题是当我试图访问控制器的构造函数中的
1 2 |
。
型
其他答案中没有提到的一件事是区分大小写,如果要在多个地方引用它(它不在原始问题中,但值得考虑,因为这个问题出现在许多类似的搜索中)。根据其他答案,我发现以下内容最初对我有用:
埃多克斯1〔10〕
但为了更加可靠,这就变成了:
江户十一〔11〕。
然后根据我的要求(检查从哪个域名访问该网站并显示相关内容):
埃多克斯1〔12〕