我有生成并存储在数据库中的用户友好网址。
当我想要一个网址时,我有一个帮助类,它给了我网址。
这个帮助方法有时会调用数据库来生成一个URL ..
根据关注点的分离,我应该在控制器中生成页面中所需的所有URL并将它们传递给视图。
或者在视图中生成网址是否可以?
此致
答案 0 :(得分:3)
马特 在这种情况下控制器。
这是一个小技巧: 有时对我有帮助的,就是说出来(尽管害怕看起来像疯子:-))
任何时候你想到你的代码并且你可以说出来:“生成”,“创造”,“破坏” - 很可能你应该在控制器中这样做。 如果您正在考虑“验证”,“数据”,“复杂搜索”方面的一段代码,那么很可能应该将其卸载到您的模型中。 如果您正在考虑这个形式应该是5像素,或者该按钮应该是绿色 - 这是视图。
有时这可能令人困惑。这是我最近的项目中的一个例子。假设您要向管理员显示某些部分,而向用户显示某些部分,则有两种方法。一种是根据权限在控制器中加载不同的布局,另一种是在浏览时检查权限。两者都有其优点。第一个是更多mvc - 但会创建代码重复,第二个方法更麻烦,更少mvc但保持你的代码DRYer。还有第三种方法(我最终使用)使用第二种方法 - 只有一种布局,但卸载所有具有基于permitions到partials的双视图或三视图的困难部分。
希望有所帮助。
答案 1 :(得分:2)
我的0.02美元:这里的真正的关注点分离问题是在同一方法中进行数据库调用和生成URI。将DB调用放入控制器并在视图中生成URI。像这样:
控制器:
// stuff
var importantNum = (from d in Repository.SomeData
where d.Id == id
select new
{
Num = d.ImportantForUri
}).First().Num;
var model.LinkData = new RouteValueDictionary { { "Important", importantNum" },
{ "Constant", "Foo"} // etc
};
return View(model);
查看:
<!-- stuff -->
<%= Html.ActionLink("Hi there", "ActionName", model.LinkData);
答案 2 :(得分:1)
生成url的过程看起来相当复杂(与模型交互),我相信它们应该在控制器中生成。
在我看来,观点应该尽可能简单