Asp.net mvc ASP.NET MVC视图中允许多少逻辑?

Asp.net mvc ASP.NET MVC视图中允许多少逻辑?,asp.net-mvc,views,Asp.net Mvc,Views,在查看ASP.NET MVC站点示例时,我看到了很多视图中包含嵌入式逻辑的示例,例如: <% if (customerIsAllowed) { %> <p>nnn</p> <p>nnn</p> <p>nnn</p> <p>nnn</p> <p>nnn</p> <% } else {%> <p>

在查看ASP.NET MVC站点示例时,我看到了很多视图中包含嵌入式逻辑的示例,例如:

<% if (customerIsAllowed)
   { %>

   <p>nnn</p>
   <p>nnn</p>
   <p>nnn</p>
   <p>nnn</p>
   <p>nnn</p>

<% }  else {%>

   <p>nnn</p>
   <p>nnn</p>
   <p>nnn</p>
   <p>nnn</p>
   <p>nnn</p>

<% } %>

nnn

nnn

nnn

nnn

nnn

nnn

nnn

nnn

nnn

nnn

虽然这对我来说似乎是错误的,因为这是我们在ASP 3.0中试图摆脱的那种东西,但我甚至在一些播客中听到“视图中的一点逻辑是可以的”,因为MVC框架的其余部分正在处理我们在ASP 3.0中没有的结构


是否有任何MVC约定指定视图中允许的逻辑类型和数量?

这取决于逻辑的原因。如果逻辑是基于控制器传递给它的某些属性选择一个替代表示,那么它可能是正常的。这允许您进行一些视图重用。不必为每个自定义权限重新创建(并重复)整个视图,您可以传入一些数据,允许基于此权限自定义视图


我认为这是理想化MVC和严格执行DRY(不要重复)之间的务实平衡。在某些情况下,如果你不能很容易地做到这两个,那么违反其中一个是明智的。在模型和基本视图明显相同的情况下,在视图中加入一点逻辑以保持视图干燥是合理的。

下面是另一种思考方法。表示逻辑进入视图。业务处理逻辑进入控制器,数据验证进入模型。但是最终应该是指导,而不是宗教:)

如果逻辑与视图的格式有关,并且不会导致实体或数据的更改,那么我认为在视图中是可以的

开玩笑吧:-)


对此没有固定的答案,尽管良好的关注点分离是公认的最佳实践。围绕这一点的争论可能是无穷无尽的,我认为知道如何为您的特定项目做到这一点需要经验,并且能够注意到“代码气味”或感觉不正确的事情。

只要视图中的逻辑是用于演示的(如果不喜欢标记文件中的代码隐藏文件,可以将其放入该文件中)然后就可以了。在您的示例中,代码/逻辑用于选择某个视图部分,这是可以的。演示文稿允许有逻辑,而不需要简单的HTML。

同意。customerIsAllowed将基于模型中的某些域逻辑填充,这使该视图逻辑在我看来是可以的。同意,逻辑量与关注点的分离。在视图中保持逻辑最小是一个实际的关注点。但是视图逻辑属于视图。同意。视图逻辑属于视图。这就是为什么我不理解在MVC中使用代码隐藏文件的严厉批评。我理解它可能被误用,但一些简单的属性或条件逻辑有时更容易在codebehind中写比在“注意到讽刺的是,当人们提到DRY时,几乎总是不得不将其扩展到括号中(不要重复你自己)。从本质上说,他们在解释规则时违反了规则。@roryok我责怪我的英语老师。我总是被教导在我第一次使用它们时扩展所有已知的缩略语,但很遗憾,我认为DRY并不像它应该的那样广为人知。-1.这是一个常见的误解。业务逻辑不属于控制器。业务逻辑是模型的一部分。控制器的任务是访问模型的适当部分,并使用假设查找结果来决定要显示的视图。我同意理想情况下,控制器中不应该有业务逻辑(一个过载术语)。但实际上,一小部分业务逻辑会出现在控制器中。我的2美分:)另一个误解是“业务逻辑”一词有一个标准的定义。因此,使用这个术语是毫无用处的,因为大多数人对它有不同的定义。