mvc视图中的复杂网址 - 谁负责构建它们?

时间:2013-03-07 18:58:28

标签: asp.net-mvc url-routing

让我们说我需要创建一个搜索页面。在该页面上有:

  • 具有许多搜索参数的复杂搜索过滤器(param1,param2,...,paramN)
  • 结果项列表
  • 寻呼机
  • 布局切换链接(列表或表格视图)

我将视图模型从我的动作传递给视图,其中包含有关搜索参数当前值的信息(来自url)和一些“猜测”参数,这些参数并非直接来自url(例如,如果用户未指定区域我们可以从他的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 个答案:

答案 0 :(得分:1)

我会使用RouteValueDictionary来构建网址的查询部分。

在动作代码中,我将填充参数并放入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>

是的,复杂的逻辑应该在行动中,因此它是可以单元测试的。你在视图中的逻辑更少 - 更好。