【问题标题】:Getting the # route in from the Request in a controller in ASP.Net MVC从 ASP.Net MVC 的控制器中的请求中获取 # 路由
【发布时间】:2015-04-30 02:48:50
【问题描述】:

我有一个使用表单身份验证的 ASP.Net MVC 网站,其中 loginUrl 设置为用于在 web.config 中进行身份验证的 Url。登录过程调用登录控制器,该控制器通过 SSO 过程进行重定向等,并且日志过程正常工作,用户可以登录等。作为登录过程的一部分,我使用 returnUrl 将用户发送到他们最初的页面请求。或者如果没有指定默认值。

如果用户在另一个页面上输入一个 URL,例如 http://mysite/help,returnUrl 就是预期的 /help。但是,如果用户输入一个包含像 http://mysite/#/test/123 这样的哈希路由的 url,returnUrl 就是 / 。是否可以从控制器中获取带有 #/test/123 的完整 url?

为了隔离这个问题,我创建了一个简单的 ASP.Net MVC Web 项目来演示这种行为,您可以看到调用控制器时缺少 # 路由:

这是 web.config:

这是浏览器中的请求:

这是测试应用程序的调试视图,您可以在其中看到 ReturnUrl 只是 /,而 RawUrl 只有查询字符串。

fiddler 中也是这样:

这里是 chrome 中登录 url 的重定向。正如您所看到的,URL 的 # 部分以某种方式保留在示例应用程序中,即使它在控制器的请求中不存在并且我在 fiddler 中看不到它。

【问题讨论】:

  • @ErikFunkenbusch - 谢谢,我怀疑这是怎么回事。我最终将我需要的 # 参数传递给了一个查询字符串参数,然后在将用户发送到页面时将其添加回来。即 ?hashstate=test%2f/3。如果您将其写为答案,我将接受此解决方案。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 forms-authentication


【解决方案1】:

“#”被称为片段,被认为是“客户端相关的”。换句话说,它是针对客户端的,不会被发送回服务器。所以,服务器不知道片段可能重定向到什么。见

http://en.wikipedia.org/wiki/Fragment_identifier

来自维基百科的文章:

片段取决于文档 MIME 类型并由客户端(Web 浏览器)评估。客户端在检索文档时不应该向服务器发送 URI 片段,并且如果没有本地应用程序(见下文)的帮助,片段不会参与 HTTP 重定向。[

【讨论】:

    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多