我读到在编写MVC时在View中使用任何逻辑是不好的做法。但通常我用这种方式使用 for each
创建表格:
@ModelType IEnumerable(of ViewModel)
<table>Prop1
<thead>
<tr>
<th>
@Html.DisplayNameFor(Function(model) model.Prop1)
</th>
<th>
@Html.DisplayNameFor(Function(model) model.Prop2)
</th>
</tr>
</thead>
<tbody>
@For Each item In Model
@<text>
<tr>
<td>
@Html.DisplayFor(Function(model) model.Prop1)
</td>
<td>
@Html.DisplayFor(Function(model) model.Prop2)
</td>
</tr>
</text>
Next
</tbody>
</table>
还有另一种方式,还是这个小逻辑还好?
答案 0 :(得分:2)
这取决于逻辑的原因。如果逻辑是根据控制器传递给它的某些属性选择备用表示,则可能没问题。这允许您进行一些视图重用。您可以传入一些允许根据此权限自定义视图的数据,而不必为每个自定义权限重新创建(并重复)整个视图。
我认为这是理想化的 MVC 与严格执行 DRY 之间的务实平衡(不要重复自己)。在某些情况下,如果你不能轻易地达到这两者,那么更明智地违反其中一个。在显然模型和基本视图相同的情况下,在视图中放置一些逻辑以保持您的视图DRY是合理的。
您使用的逻辑是平衡的。 他声明你通过了,在View中使用逻辑是正确的,但是在业务逻辑的情况下。
MVC部分是。简而言之,它们是:
模型 =域逻辑
查看 =输出逻辑
控制器 =输入逻辑
但可以使用条件语句。即使您可以使用一些迭代语句填充View。 它没有错,
答案 1 :(得分:1)
我认为您可能已经阅读的内容是,您的视图中不应该有可以在您的控制器中执行的业务逻辑。
您应该执行在控制器中设置模型值的操作,然后将其传递给视图。除了渲染页面之外,视图通常不需要任何进一步的处理,因此循环列表和其他对象以便在页面上显示它们是可接受和必需的。
如果视图中的代码是通用的,并且可以在多个视图中重复使用,我建议您创建一个可以重复使用的HTML帮助程序,这样可以使您的视图更加清晰。
希望这有帮助!
答案 2 :(得分:0)
只要您将视图绑定到服务器端的模型,这是正确的方法。
另一种方法是在客户端绑定视图,我认为这是一个非常好的做法。 AngularJs是这样做的野兽库。您只需检索纯HTML,然后将模型作为json获取,并使用angular将视图与纯javascript对象绑定。
https://angularjs.org/
答案 3 :(得分:0)
我同意有关视图模型数据的条件应该位于视图模型中,您应该避免在视图中使用它。
然而,对于每个循环而言,只需为项目列表呈现相同的标记,这是完全可以接受的。
即使您在某些时候使用了单独的部分视图或显示/编辑器模板,您也必须迭代一个项目列表以生成重复的标记。
答案 4 :(得分:0)
根据我所听到和阅读的关于MVC for ViewModel Binding的良好实践,这是一个很好的做法。 ViewModel Binding有助于维护模型和控制器之间的关系。而不是使用ViewBag或ViewData等任何其他方法显示它,使用ViewModel Binding是更优化的方法。 我认为不好的做法是在View
中使用多个linq查询例如。
@Model.Where(x=>x.Column1.Equals("1")).Select(y=>y.column2)
如果你有一个简单的foreach循环,循环遍历模型,这是一个很好的做法,因为你没有在模型上执行任何linq查询
如果我错了,请纠正我