让我们说我需要创建一个搜索页面。在该页面上有:
我将视图模型从我的动作传递给视图,其中包含有关搜索参数当前值的信息(来自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是视图还是动作的责任?
答案 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>
是的,复杂的逻辑应该在行动中,因此它是可以单元测试的。你在视图中的逻辑更少 - 更好。