【问题标题】:Get Return URL Query String Value having #获取具有 # 的返回 URL 查询字符串值
【发布时间】:2014-06-30 15:18:24
【问题描述】:

我正在开发一个使用Angular.jsASP.NET MVC 的应用程序。 angular.js 的路由包含一个“#”。无需登录即可查看应用程序中的某些页面。但是,这些页面包含应用程序中需要用户登录的页面的 URL。它们看起来像:

<a href="~/#/shop/voucher/6bc1">Want this voucher?</a>

因此,当点击这些链接时,MVC 表单身份验证会重定向到登录页面,返回 URL 查询字符串如下所示:

http://localhost:18030/signin?ReturnUrl=%2f#/shop/voucher/6bc1

所以在登录页面上,当我尝试查看查询字符串时,我只得到返回 URL 的“/”,因为那是 %2f 部分。由于#,我失去了剩余的价值。

如果我尝试对链接进行 URL 编码,# 和其他“/”字符会被编码,但随后路由会变得混乱,我会收到 404 错误。

是否可以访问带有“#”的完整查询字符串值?我不确定为什么表单身份验证不编码#。

【问题讨论】:

    标签: asp.net-mvc angularjs razor forms-authentication query-string


    【解决方案1】:

    url fragment 永远不会发送到服务器,所以你必须在这里获得一点创意。

    我过去解决此问题的一种方法是使用客户端代码修改登录的操作 URL,并将片段附加为查询字符串参数。

    //Pulls out everything past the '#'
    var fragment = $location.path();
    
    $scope.fragmentParam = "&fragment=" + fragment;
    

    您可以将该查询字符串参数附加到您的表单操作中,然后在服务器端对其进行处理,以便适当地重定向用户。

    public ActionResult Login(MyLoginInfo info, string returnUrl, string fragment){
    
        //Normal login code
    
        var redirectUrl = String.Format("{0}#{1}", returnUrl, fragment);    
    
        Redirect(redirectUrl);
    
    }
    

    这是一个简化的版本,但您应该能够大致了解。您需要将该信息传递给服务器,然后重构包含该片段的重定向 url。

    【讨论】:

    • 谢谢!你的回答让我想到了正确的方向。得到它的工作。 :)
    猜你喜欢
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多