我有一个场景,我需要把用户发送到登录页面,returnurl参数填入他们当前所在的页面。包括 url片段,所以当他们完成登录时,他们会被引导回原来的页面,页面会向下滚动到一个特定的#location。
目前,这一切都在工作,除了url片段丢失,当 returnUrl
抵达 Login
ActionMethod。
有没有办法保留这个url片段,使它在登录阶段不会丢失?我在登录页面可以看到url中的#fragment,但是当我查看登录方法中'returnUrl'的值时,它似乎被剥离了。
有没有办法保留这个url片段,使它不会在登录阶段丢失?
没有,没有。url片段永远不会被发送到服务器上。一种可能是在客户端修改returnUrl,然后再传给服务器,这样url片段就会成为查询字符串的一部分。然后当登录成功,服务器需要重定向回returnUrl时,它会将其修改为原始值。
例如,在将它发送到Login方法之前,它可能看起来像这样。
http://example.com/admin/index?fragment=somefragment
如果你的重定向登录网址是这样的: https://example.com/Login?ReturnUrl=%2F#/protected/page
哈希(#)右边的任何内容都不会被传递给服务器。如果你检查你的表单,你会发现表单操作省略了哈希片段。
<form action="/Login?ReturnUrl=%2F" id="login-form" method="post" role="form">
....
</form>
请注意表单动作中缺少的片段。我解决这个问题的方法是通过捕捉url中的hash片段,并通过javascript将其添加到表单动作中。就在登录表单的下面,我有这个内联脚本。
<script type="text/javascript">
window.onload = function () {
var hash = window.location.hash.substr(1);
if (hash !== "") {
var form = document.getElementById('login-form');
var action = form.getAttribute("action") + 'NHASH' + encodeURIComponent(hash);
form.setAttribute("action", action);
}
}
</script>
所以现在表单动作看起来是这样的 action="/Login?ReturnUrl=%2FNHASH%2Fprotected%2Fpage"
. 在服务器端,成功认证后,在重定向到ReturnUrl之前,你替换了 NHASH
与 #
诸如
returnUrl = returnUrl.Replace("NHASH", "#");
请注意,您可以使用任何令牌。 你可以使用任何令牌用于 #
. 我只是选择了 NHASH