2014-07-22 50 views
1

我有一个使用AngularJS作为路由和ASP.NET MVC作为后端的页面。如何阅读在ASP.NET MVC中包含#的查询字符串?

当我的一些用户发送类似如下的要求:

http://mysite/myApp/Accounts/Login?ReturnUrl=%2fmyApp%2f#/myspa1 

我希望他们首先登录,然后被重定向到ASP.NET MVC他们重定向中选取适当的角度路线:

不幸的是,在ASP.NET MVC控制器中,我看不到使用Request.QueryString["ReturnUrl"]#符号后传递的任何值。

任何想法我该如何解决这个问题?

+2

[如何从服务器端获取Url哈希(#)]的可能重复(http://stackoverflow.com/questions/317760/how-to-get-url-hash-from-server-side) –

+1

什么如下哈希不会发送到服务器。你需要一些Javascript魔术来尝试这个。 –

+0

谢谢罗文,你发送的URL似乎正是我所需要的。 – rcarrillopadron

回答

1

之后的URL部分称为“片段”。它不会发送到服务器,因为它旨在提示JavaScript或浏览器中的操作。更多关于here

如果您的不是实际上意图代表一个片段,则应该由任何提交请求的人逃脱(与%23)。

否则,您将不得不使用JavaScript函数将数据发送到服务器,但这并不是特别好,更不用说通用的解决方案。

在你的具体例子中,http://mysite/myApp/Accounts/Login?ReturnUrl=%2fmyApp%2f#/myspa1,我不确定你在找什么。

但是,我假设您要ReturnUrl参数映射到/myApp/#/myspa1?在这种情况下,重定向代理应该是URL转义参数地址的完整,而不是事后追加任何东西。

在另一方面,如果你的ReturnUrl意味着仅代表/myApp/,而片段部分,就是要传递到登录页面,你应该处理JavaScript中的需要,因为它不会是立即发送到服务器。

编辑:

我看到这张贴在评论作为一种解决方案,所以我会追加究竟是什么“JavaScript作为需要被”指的是。 This answer在这里特别有用。

实质上,这个想法是在页面执行回发到服务器时捕获URL片段,并将其存储在服务器端控件中。

例如,

<asp:HiddenField runat="server" ID="URLFragmentValue" /> 

<script> 
    $("form").submit(function() { 
     $('#<%= URLFragmentValue.ClientID %>').val(window.location.hash); 
    }); 
</script> 

或者该脚本的非jQuery的形式:

<form onsubmit="setUrlFragment()"> ... </form> 

<script> 
    function setUrlFragment() { 
     document.getElementById('<%= URLFragmentValue.ClientID %>').value = window.location.hash; 
    }); 
</script> 

这是它的要点。这个答案也给出了一个如何在页面的负载中检索和注入散列片段的例子,但这与你的问题的范围看起来并不相关。

当页面碰到你的服务器时,你可以检查URLFragmentValue.Value,幸运的话,你可以查看和处理你的分段值。

但是,我要强调一下,你应该确保你正确地使用了片段。有时候,比如在后卫的情况下,你需要做这样的事情。但是也有一些时候,碎片被滥用,这是一种使这种滥用的手段。确保你不在这个方面。在实施可以有条件地认为的Band-Aid来解决这个问题之前,理解其含义并且有合理的推理。

+0

很好的解释。我不明白为什么需要使用jQuery。 – rcarrillopadron

+0

@rcarrillopadron不错,这里不需要。但它往往让事情变得更容易一些,许多项目已经在使用它。我在另一个不使用它的情况下添加了。没错,对吗?我非常累,所以我可能犯了一个错字,甚至是一个巨大的错误。 –