我正在使用AngularJS开发一个SPA应用程序,使用REST Web API,在一个非常小的ASP.NET MVC4层上。由于这里不重要的原因,我没有使用MVC4的默认帐户控制器。
基本上,我想在用户之间共享“任务”。我的目标是能够通过电子邮件将特定“任务”实体的URL发送给任何用户。单击该URL应启动身份验证。身份验证成功后,我想显示真实的任务页面信息。AngularJS使我的网址有#符号,或显示任务“XYZ123”的网页的网址为: http://hostname.com/#/tasks/XYZ123
ASP.NET将对该URL的未授权访问重定向到: http://hostname.com/Home/Login?ReturnUrl=%2f#/tasks/XYZ123
这没关系,但相关的控制器方法会“切断”#的路径,所以在:
public ActionResult Login(string returnUrl)
'returnUrl'的值只是“/”
所以,我正在失去道路:我想建立一个具有原始网址的“与Facebook连接”链接,如:
http://hostname.com/Login/ExternalLogin?ReturnUrl=%2F#/tasks/XYZ123
但我不能。
解决此问题的正确方法是什么?
我可以考虑在没有#tag的情况下创建自己的重定向服务URL,但是这个解决方案意味着额外的工作,并且仅涵盖系统发送带有任务URL的消息的情况 - 人类仍将尝试复制/粘贴该位置来自浏览器的网址。
感谢任何提示。
最高
答案 0 :(得分:3)
是。浏览器切换## tasks / XYZ123'并请求没有该哈希的页面。 虽然哈希本身出现在登录页面上 - 但它又是浏览器的工作。 哈希没有前往服务器。
因此,当浏览器使用?ReturnUrl =%2f#/ tasks / XYZ123加载登录页面时,我们可以重写表单操作并对哈希进行编码。
如果表单如下:
<form action="/Home/Login" method="post" >
...
</form>
javascript代码应如下所示:
<script src="~/js/jquery.js"></script>
<script type="text/javascript">
$(function() {
var search = $(location).attr('search') || '';
var hash = $(location).attr('hash') || '';
if (hash.length === 0) {
if (window.history.pushState) {
window.history.pushState('login', 'Login', '/Home/Login');
}
} else if (search === '?ReturnUrl=%2f') {
$('form').attr('action', '/Home/Login' + search + encodeURIComponent(hash) );
}
});
</script>
以下内容需要包含 window.history.pushState 的部分:
如果没有哈希值,那么对于SPA,其URL(更有可能)将是:
http://hostname.com/Home/Login?ReturnUrl=%2f
所以这里我们尝试用更准确的
替换URL(没有页面重新加载)http://hostname.com/Home/Login
答案 1 :(得分:0)
您可以使用Request
(如.Url
或.QueryString
)的属性来获取原始网址(和网址参数),而不是依赖于returnUrl参数的自动绑定。
答案 2 :(得分:0)
用%23替换returnUrl中的#