C# MVC3模型数据分离
我注意到,我在视图中输入的许多字段都是控制逻辑:C# MVC3模型数据分离,c#,asp.net-mvc-3,design-patterns,razor,C#,Asp.net Mvc 3,Design Patterns,Razor,我注意到,我在视图中输入的许多字段都是控制逻辑: @if (Model.IsAdmin) { <p>You're an admin</p> } @if(Model.IsAdmin){ 你是管理员 } 我对MVC应该如何工作的理解是,进入模型的内容应该更像一个数据,如果它是一个表单,它将返回,用户可以查看/更改,等等 将控制逻辑放在一个视图中是一种糟糕的做法吗?在MVC中将控制逻辑传递给视图的惯例是什么?如果您的视图中有很多控制逻辑,那么我的建议是处理控制器中的控制
@if (Model.IsAdmin) {
<p>You're an admin</p>
}
@if(Model.IsAdmin){
你是管理员
}
我对MVC应该如何工作的理解是,进入模型的内容应该更像一个数据,如果它是一个表单,它将返回,用户可以查看/更改,等等
将控制逻辑放在一个视图中是一种糟糕的做法吗?在MVC中将控制逻辑传递给视图的惯例是什么?如果您的视图中有很多控制逻辑,那么我的建议是处理控制器中的控制逻辑,然后针对不同的角色使用不同的视图 控制器逻辑
if(IsAdmin)
return View('AdminPage')
else
return View('UserPage')
这样做的目的是让您的视图只关注于显示提供给它们的数据,并将逻辑分离到后台(控制器)
然而,如果这种情况只发生在几个地方,那么它可能没有那么糟糕。在没有看到完整代码的情况下,我无法确定,因为没有任何东西是完全黑白分开的。我觉得这个特定的示例很好,您正在呈现(视图域)您的数据(模型域),您得到的是基于您收到的数据 典型的经验法则是,如果它比1-2条件@if更复杂,则将其拆分为不同的、更好的专用视图(或使用专用的局部视图),但实际上,在MVC项目中,您永远不会看到没有流控制的视图(甚至不仅仅是ASP.NET的实现) 将控制逻辑放在一个视图中是一种糟糕的做法吗
不,您完全可以在视图中使用视图逻辑来有条件地显示或隐藏某些部分。您的特定示例在视图中非常好。如果需要,您可以将其添加到控制器中
if(user.IsAdmin)
ViewBag.WelcomeMessage = "You are an admin";
else
ViewBag.WelcomeMessage = "You are a user";
您可能应该使用角色进行授权,而不是设置属性。像那样。大概是这样的:
@if(User.IsInRole("Admin")) {
<p>You're an Admin!</p>
}
@if(User.IsInRole(“Admin”)){
你是管理员
}
如果您愿意,您可以将其封装到一个或创建一个Html帮助程序中,使其更干净(如果您在许多地方使用它)即使差异很小?为了不让逻辑出现在视图中而到处复制视图似乎不是很枯燥,这正是我想表达的观点。如果差异很小,那么这也不错(正如其他人所建议的)。但是,如果有一半的视图由于控制逻辑而改变,那么我建议创建另一个视图。另外,如果只是内容在更改,那么您可以创建一个在控制器中更新的模型(正如Stephen所建议的)。但是,如果只是一些小东西,那么你应该保持原样。我的观点是,答案不一定是黑白+1
逻辑,在视图中有条件地显示或隐藏某些部分
是这里的重点。非常好的经验法则-我想我会采用它。