MVC3模型数据分离

时间:2012-02-29 15:35:00

标签: c# asp.net-mvc-3 design-patterns razor

我注意到,我在视图中添加的很多字段都是控制逻辑:

@if (Model.IsAdmin) {
  <p>You're an admin</p>
}

我对MVC应该如何工作的理解是,进入模型的内容应该更像是一个数据,如果它是一个表单,则返回它,它是供用户查看/更改的,等等。

将控制逻辑置于不良实践中吗?将控制逻辑传递给MVC中的视图的惯例是什么?

5 个答案:

答案 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帮助器以使其更清洁(如果您在许多地方使用它)