2014-07-22 87 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不錯,這裏不需要。但它往往讓事情變得更容易一些,許多項目已經在使用它。我在另一個不使用它的情況下添加了。沒錯,對嗎?我非常累,所以我可能犯了一個錯字,甚至是一個巨大的錯誤。 –