【问题标题】:Get current fragment in Route, ASP.net MVC在 Route, ASP.net MVC 中获取当前片段
【发布时间】:2011-06-08 22:05:46
【问题描述】:

是否可以从通过操作链接发出的路由中获取当前片段。这就是我从路线中获得行动的方式。

string currentAction = requestContext.RouteData.Values["action"] as string ?? “索引”;

我可以做类似的事情吗?

string currentFragment = requestContext.RouteData.Values["Fragment"] as string ?? "";

【问题讨论】:

  • 您能详细说明片段的含义吗?您是否尝试获取部分 URL?

标签: asp.net-mvc hash routes


【解决方案1】:

不,你不能做这样的事情。片段(URL 中 # 符号后面的所有内容)永远不会由浏览器发送到服务器,因此谈论获取 url 片段服务器端的唯一事实根本没有意义。

因此,如果您有以下 url:http://example.com/foo/bar?key1=value1#abc,服务器将永远无法获取 abc,因为客户端永远不会发送它。

【讨论】:

  • 您能否在投票时发表评论,解释为什么您认为这个答案是错误的?
  • 我就是这么想的。如果通过 Html.ActionLink 发送呢?
  • @brenjt,不管它是如何发送的。服务器永远不会得到它。您可以使用 AJAX 调用来分析 url,并将 # 符号后面的部分替换为服务器可以读取的普通查询字符串参数。例如,如果您有 http://example.com/foo/bar?key1=value1#abc,您可以让 AJAX 调用操作此 url 并将其替换为 http://example.com/foo/bar?key1=value1&foo=abc,然后让您的服务器使用 foo 查询字符串参数。但是如果没有 javascript,您将永远不会在服务器上的 url 中获得 # 之后的任何内容。
【解决方案2】:

正如已经指出的那样,这是不可能的。文档片段(您称其为哈希后的字符串)仅用于浏览器正确定位视口。它们对服务器没有意义,因此不会在那里传输。

但是,您可以使用一种解决方法。重复该片段作为您的 url 的一部分,以使其可供服务器访问。

查看此问题答案的永久链接。例如,我的答案的链接如下所示:

http://stackoverflow.com/questions
/6285833/get-current-fragment-in-route-asp-net-mvc/6286097#6286097

查看值 6286097 如何被复制为最后一个路由参数。这是故意的。您也可以使用这种技术。

附:片段必须指向文档中的标识符(某些 HTML 元素的 id)。至少在 XHTML 中,只有标识符作为片段起作用。有效的 id 可能不以数字开头,因此请使用 #answer-6286097 之类的东西来代替 #6286097

附言#2。不要使用任何 JavaScript 技巧来绕过此限制。基本的网站功能和设计必须在没有 JavaScript 的情况下工作 - 不要听信任何人告诉你。片段显然属于基本工具箱。仅将 JavaScript 用于高级交互。

【讨论】:

    【解决方案3】:

    我有一个解决方法,但首先让我们深入了解这个问题。

    散列符号后面的字符串称为片段值不是查询参数,而是客户端读取的字符串(位于浏览器中),服务器无法读取它们,因为它们没有发送到服务器通过浏览器。

    出于安全原因,Google 和 Azure 等一些身份验证提供程序将访问令牌作为 Fragment 值发送,以便在作为身份验证提供程序的直接响应发送后,它们不会通过 Internet 传输。

    您可以解决的唯一方法是使用 javascript 通过将“#”替换为“?”来将片段值转换为查询参数。并重定向到服务器控制器中的端点。

    我想最简单的方法是从服务器处理所有这些,这意味着您在服务器中获取请求,即时向浏览器发送 javascript 代码,将“#”替换为“?”并重定向到您的第二个端点,该端点将令牌读取为强参数。

    在 ASP.NET Core 3.1 中如何做到这一点:

    [AllowAnonymous]
    [HttpGet("authredirect")]
    [Produces("text/html")]
    public virtual ContentResult ConvertUrlFragmentToQueryParamThenRedirect()
    {
      return Content("<html><script>window.location.href=window.location.href.replace('#', '?').replace('authredirect', 'authparams')</script></html>", "text/html");
    }
    
    [AllowAnonymous]
    [HttpGet("authparams")]
    public virtual void GetAccessToken([FromQuery] string access_token)
    {
      // now you have your access token server side here
    }
    

    请记住将您的redirectUrl 设置为正确的,在本例中为“YOUR REDIRECT URL/authredirect”。

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      相关资源
      最近更新 更多