0

假设我需要创建一个搜索页面。在那个页面上有:

  • 具有许多搜索参数(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是视图的责任还是动作的责任?

4

1 回答 1

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>

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

于 2013-03-07T19:26:43.670 回答