2013-03-07 73 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