我正在使用Angular.js
和ASP.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错误。
无论如何都要访问带有'#'的完整查询字符串值吗?我不确定为什么表单身份验证不会编码#。
答案 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。