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

我正在使用我正在建设的博客上的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。

解决方案

下面是我的解决方案的最终代码:

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

你可以使用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中有一个bug(可以绕过,见下文)。Net在使用端口而不是端口80的机器上产生(如果内部网站通过虚拟IP上的负载平衡发布,并且端口用于内部发布规则,这是一个大问题)。Net将总是AbsoluteUri属性上添加端口——即使原始请求没有使用它。

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

至少,它在我们的(相当复杂!)环境中是这样的:)

如果有任何奇怪的代理之间重写主机头,那么这也不会工作。

2013年7月30日更新

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

虽然我不得不说,当我尝试它的时候,我不能让它工作-但那可能只是我打错了或别的什么。

2012年7月9日更新

不久前我偶然发现了这个问题,并打算更新这个答案,但一直没有。当这个答案得到好评时,我想我应该现在就做。

我在Asp中提到的“bug”。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 */
...

我个人没有使用过它——它没有文件,因此不能保证一直存在——但是它可能会做我上面提到的同样的事情。为了增加搜索结果的相关性——并承认其他人似乎已经发现了这一点——Nick Aceves在推特上也提到了'aspnet:UseHostHeaderForRequest'设置

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

should work perfectly, especially if you only want the relative Uri (but keeping querystrings)

我也在寻找这个Facebook的原因,到目前为止,没有一个答案是必要的,或者太复杂了。

@Request.Url.GetLeftPart(UriPartial.Path)

获取“不包含”查询字符串的完整协议、主机和路径。如果您使用的不是默认的80,也包括端口。

在其他答案中没有提到的一件事是大小写敏感性,如果它将在多个地方被引用(在最初的问题中没有,但值得考虑,因为这个问题出现在许多类似的搜索中)。根据其他答案,我发现以下方法最初对我有用:

Request.Url.AbsoluteUri.ToString()

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

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

然后对于我的要求(检查网站正在访问的域名并显示相关内容):

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

我最喜欢的…

Url.Content(Request.Url.PathAndQuery)

或者只是……

Url.Action()

对我来说,问题是当我试图访问控制器的构造函数中的HTTPContext时,而HTTPContext还没有准备好。当移动到索引方法,它工作:

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

浏览器历史记录的大小写(单页样式)

HttpContext.Request.UrlReferrer

这对我来说适用于Core 3.0的完整URL:

$"{Request.Scheme}://{Request.Host.Value}{Request.Path.Value}"