【问题标题】:How to get current page URL in MVC 3如何在 MVC 3 中获取当前页面 URL
【发布时间】: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" width="900"></fb:comments>
</div>

获取当前页面 URL 的最佳方法是什么?请求网址。

解决方案

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

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

【问题讨论】:

    标签: c# asp.net asp.net-mvc razor


    【解决方案1】:

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

    $"{Request.Scheme}://{Request.Host.Value}{Request.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}://{1}{2}",
                   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 文档中!
              猜你喜欢
              • 1970-01-01
              • 2011-05-25
              • 2010-11-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-12-22
              • 2015-11-11
              • 2017-08-23
              相关资源
              最近更新 更多