2013-03-07 35 views
0

可以說我需要創建一個搜索頁面。該網頁上有:mvc視圖中的複雜網址 - 誰負責構建它們?

  • 與許多搜索參數(參數1,參數2,...,paramN)
  • 的結果項
  • 尋呼機
  • 佈局開關鏈接列表複雜的搜索過濾器(列表或表格視圖)

我將視圖模型從我的動作傳遞給視圖,其中包含有關當前搜索參數值(來自url)和一些「猜測」參數(它們不是直接來自url)例如,如果用戶這樣做es不指定區域,我們可以從他的ip中猜出它)。現在

,在尋呼機每一個環節我不得不寫這樣

<a href="@Url.Action(null, new { page = n, param1, param2, ..., paramN, region })">... 

對於佈局切換鏈接代碼,我得寫類似,但不同的代碼:

<a href="@Url.Action(null, new { page = currentPage, mode = DisplayModes.List, param1, param2, ..., paramN, region })">list</a> 
<a href="@Url.Action(null, new { page = currentPage, mode = DisplayModes.Table, param1, param2, ..., paramN, region })">table</a> 

我不喜歡的是,有多少代碼泄漏到視圖中。這很難維護,很難測試。

所以我徘徊正在構建這樣複雜的頁面的url是視圖或行動的責任?

回答

1

我會用RouteValueDictionary構建url的查詢部分。

在操作代碼,我將填補參數,並把在ViewBag:

var routes = new System.Web.Routing.RouteValueDictionary(); 
routes.Add("param1", "value1"); 
routes.Add("param2", "value2"); 

ViewBag.routes = routes; 

,然後構造我的查看鏈接一樣:

@Html.ActionLink("List", null, (RouteValueDictionary)ViewBag.routes) 

或者如果你喜歡使用Url.Action:

<a href="@Url.Action(null, ViewBag.routes)">List</a> 

是的,複雜的邏輯應該在行動,所以它是單元測試。您在視圖中擁有更少的邏輯 - 更好。

+0

你的建議的問題是,我需要不同的參數尋呼機和顯示模式的網址。 – 2013-03-08 05:10:43

+0

這是怎麼回事?創建2個RouteValueDictionary對象,每個Url一個。 – Nenad 2013-03-08 07:58:35

+0

然後,最好在內部完全構建url內部的路由 - 這些自定義路由值在他們創建的非常特定的url之外沒有用處。 – 2013-03-08 08:17:40