Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC3模型数据分离_C#_Asp.net Mvc 3_Design Patterns_Razor - Fatal编程技术网

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
逻辑,在视图中有条件地显示或隐藏某些部分
是这里的重点。非常好的经验法则-我想我会采用它。