2011-04-06 175 views
47

我需要實現哈希值即網址應該是這樣的哈希值:包括ASP.NET MVC URL路徑

/家庭/索引/#創建

對於這個已添加路線:

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/#{detail}", // URL with parameters 
    new { controller = "Login", action = "LogIn", detail =""} // Parameter defaults 
); 

在訪問/home/index/#create,它被重定向到我的默認路由。

這怎麼辦?

+1

基於一些答案。我知道#hash,瀏覽器不會向服務器發送請求,但只有當URL在同一頁面內第二次更改時纔會發送請求。所以這個問題仍然有意義。想想如果用戶收藏這個URL! #hash可能會引用評論錨或代表選定的菜單。我仍然在尋找一種正確的方式來實現這一點。 – CallMeLaNN 2011-06-03 02:18:49

回答

46

因爲此值永遠不會發送到服務器,所以無法在服務器上#符號之後獲取該值。只有客戶端的JavaScript有權訪問這個,所以使用散列定義路由沒有多大意義。

+11

它是有道理的。我的'#散列'用於記憶選定的菜單(我不想要cookie)。當用戶點擊一個菜單時,'#'改變並且AJAX請求到服務器去更新相應的內容。通過這種方式,用戶能夠使用所選菜單爲頁面添加書籤,並且可以使用具有可讀的'#menuname'的瀏覽器後退按鈕。下次用戶使用'#'瀏覽時,加載的頁面已經具有選擇的菜單而沒有不必要的AJAX請求。我需要將哈希值綁定到路由數據中,因爲每個'#'都可以被認爲是不同的頁面。 – CallMeLaNN 2011-06-03 02:37:28

+1

您可以使用JavaScript將其作爲表單請求的一部分發送給服務器。 – 2011-10-24 17:22:33

5

當瀏覽器發出URL請求時,它不會在散列後向服務器發送任何內容。這條路線可能使您能夠生成包含散列值的路由URL,但當用戶導航到這樣的URL時,無法執行任何操作服務器端。這只是網絡的工作方式...

94

如上所述,沒有辦法使用路由來做到這一點。唯一可行的解​​決方案是在您的控制器的操作中重定向時將#片段附加到您的URL。例如。

return Redirect(Url.Action("Index", "Home") + "#create"); 
+8

IMO應該是被接受的答案。 OP問道:「這怎麼能做到?」這是唯一給你一個合理解決方法的答案,而不是你爲什麼不能像OP最初想要的那樣做。 – 2014-02-17 11:19:10

+1

我只花了20分鐘試圖弄清楚如何製作一個「返回View()」方法來允許散列參數或任何其他動作結果 - 這是完美的。好答案! – nocarrier 2014-08-11 03:55:47