如何在 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 的构造函数中访问 HTTPContextHTTPContext 尚未准备好时。在 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.RawUrlRequest.Url.OriginalStringRequest.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 视图中的以下复制/粘贴左侧的 ---&gt; 指示:

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的主要内容,如果未能解决你的问题,请参考以下文章

在ASP.NET MVC 中获取当前URLcontrolleraction

在 MVC 操作上获取当前页面名称 [重复]

如何在 GAE 模板中获取当前页面的 url

如何在PHP中获取当前页面的URL [重复]

前端使用js如何准确获取当前页面url网址信息

如何在 jQuery Mobile 1.4.5 中获取当前页面 URL?