如何阻止 ASP.Net MVC Html.ActionLink 使用現有的路由值?
我正在處理的網站有一些相當複雜的路由結構,我們在使用路由引擎以我們需要的方式建構 URL 時遇到了一些困難。
我們有一個搜尋結果頁面,它使用基於 RegEx 的模式匹配將多個變數分組到單個路由段中(即“www.host.com/{structuralParameters}”可以如下:“www.host.com/variableA-variableB- variableC" - 其中變數 A 到 C 都是可選的)。經過一些工作,這對我們來說很好。
我們遇到的問題解決了 ActionLink 方法的一個煩人的特性:如果你指向同一個控制器/動作,無論你是否想要它們,它都會保留現有的路由值。我們更願意控制連結的外觀,並且在某些情況下,不能保留現有參數。一個例子是我們網站的主導航指向一個沒有設置參數的搜尋結果頁面 - 如果您願意,可以使用預設搜尋頁面。我說這是一個令人討厭的功能,因為它是 ASP.Net MVC 框架的一個罕見實例,似乎在沒有明顯擴展點的情況下指示實現——我們不希望創建自定義 ActionLink 程式碼來在我們的母版頁中編寫簡單的導航連結!
我看到有人說您需要將此類參數顯式設置為空字元串,但是當我們嘗試這樣做時,它只是將參數從路由值更改為查詢字元串參數。在我看來,我們應該被要求明確排除我們沒有作為參數明確傳遞給 ActionLink 方法的值,但如果這是我們唯一的選擇,我們將使用它。但是目前如果它顯示在查詢字元串中,那麼它對我們來說就像直接將參數放入路由中一樣無用。
我知道我們的路由結構加劇了這個問題 - 如果我們使用更簡單的方法(即 www.host.com/variableA/variableB/variableC),我們可能不會有任何問題,但我們的 URL 結構是不可協商的 - 它是旨在滿足與可用性、搜尋引擎優化和連結/內容共享相關的非常具體的需求。
我們如何使用 Html.ActionLink 生成頁面連結而不依賴於目前的路由數據(或者,如果可能,需要顯式排除路由段),即使這些連結導致相同的操作方法?
如果我們確實需要明確排除路由段,我們如何防止該方法將路由呈現為查詢字元串參數?
這個看似很小的問題給我們帶來了令人驚訝的悲傷,我將感謝任何幫助解決它。
編輯:按照 LukLed 的要求,這是一個 ActionLink 呼叫範例:
// I've made it generic, but this should call the Search action of the // ItemController, the text and title attribute should say "Link Text" but there // should be no parameters - or maybe just the defaults, depending on the route. // // Assume that this can be called from *any* page but should not be influenced by // the current route - some routes will be called from other sections with the same // structure/parameters. Html.ActionLink( "Link Text", "Search", "Item", new { }, new { title = "Link Text" } );
Html.ActionLink在呼叫or (或任何 URL 生成方法)時將路由值設置為 null 或空字元串Html.RouteLink將清除“環境”路由值。例如,使用標準 MVC 控制器/動作/id 路由,假設您在“Home/Index/123”上。如果您呼叫,則 MVC 將注意到and
Html.RouteLink(new { id = 456 })的“環境”路由值。它還會注意到環境路由值,但它會被顯式的“456”覆蓋。這將導致生成的 URL 為“Home/Index/456”。controller="Home"``action="Index"``id="123"參數的順序也很重要。例如,假設您打電話給
Html.RouteLink(new { action = "About" }). “關於”動作將覆蓋目前的“索引”動作,而“id”參數將被完全清除!但你問為什麼?因為一旦你使一個參數段失效,那麼它之後的所有參數段都將失效。在這種情況下,“action”被一個新的顯式值無效,因此緊隨其後且沒有顯式值的“id”也被無效。因此,生成的 URL 將只是“Home/About”(沒有 ID)。在同樣的情況下,如果您呼叫
Html.RouteLink(new { action = "" }),則生成的 URL 將只是“Home”,因為您使用空字元串使“action”無效,然後導致“id”也無效,因為它出現在無效的“action”之後”。