我注意到,我在视图中添加的很多字段都是控制逻辑:
@if (Model.IsAdmin) {
<p>You're an admin</p>
}
我对MVC应该如何工作的理解是,进入模型的内容应该更像是一个数据,如果它是一个表单,则返回它,它是供用户查看/更改的,等等。
将控制逻辑置于不良实践中吗?将控制逻辑传递给MVC中的视图的惯例是什么?
答案 0 :(得分:4)
将控制逻辑置于不良实践中吗?
不,你可以完全没有视图中的视图逻辑来有条件地显示或隐藏某些部分。您的特定示例在视图中完全正常。
答案 1 :(得分:1)
如果你的视图中有很多控制逻辑,那么我的建议是处理控制器中的控制逻辑,然后对不同的角色有不同的视图。
控制器逻辑
if(IsAdmin)
return View('AdminPage')
else
return View('UserPage')
我们的想法是让你的观点只关注显示给他们的数据,并让逻辑分成背景(控制器)。
然而,如果你只在几个地方发生这种情况,那么它可能并不那么糟糕。在没有看到完整代码的情况下,我无法肯定地说,因为没有任何东西在黑白中完全分开。
答案 2 :(得分:1)
这个特定的例子对我来说似乎很好,你正在呈现(视图域)你的数据(模型域),你得到的是基于你收到的数据。
典型的经验法则是,如果它比1-2条件@if
更复杂,则将其拆分为不同的,更好的专业视图(或使用专门的部分视图),但实际上你永远不会真正看到MVC项目中没有流控制的视图(甚至不是ASP.NET的实现)。
答案 3 :(得分:1)
如果需要,可以将其添加到控制器。
if(user.IsAdmin)
ViewBag.WelcomeMessage = "You are an admin";
else
ViewBag.WelcomeMessage = "You are a user";
答案 4 :(得分:0)
您可能应该使用角色进行授权而不是设置属性。像那样。像这样:
@if(User.IsInRole("Admin")) {
<p>You're an Admin!</p>
}
如果您愿意,可以将其封装到Razor helper中或创建一个Html帮助器以使其更清洁(如果您在许多地方使用它)