获取返回URL查询字符串值#

时间:2014-06-30 15:18:24

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

我正在使用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错误。

无论如何都要访问带有'#'的完整查询字符串值吗?我不确定为什么表单身份验证不会编码#。

1 个答案:

答案 0 :(得分:3)

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。