是否可以在View(替代品)中使用每个循环?

时间:2015-07-29 14:40:56

标签: asp.net-mvc vb.net

我读到在编写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>

还有另一种方式,还是这个小逻辑还好?

5 个答案:

答案 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查询

如果我错了,请纠正我