MVC业务逻辑与显示/ UI逻辑

时间:2016-05-06 11:26:12

标签: asp.net-mvc design-patterns razor separation-of-concerns

所以,我使用下面的代码在初始加载时在页面上显示了几个元素。

<script type="text/javascript">

    $(function(){
        @if (ViewBag.PageFunction == "Edit" && Model.ProductType.ProductTypeName == "Book")
        {
            @:$('#product-isbn').show();
        }

        @if (ViewBag.PageFunction == "Edit" && Model.HasBulkDiscount == true)
        {
            @:$('#product-bulk-discount').show();
        }
    });

</script>

我们最近搬到了MVC,我的经理和同事告诉我,顶层控制结构是业务逻辑,但底层控制结构不是业务逻辑,我不应该有业务逻辑图。

我不同意并觉得这是我认为完全有效的代码。我是对的还是我错的?

我的经理也告诉我,我不应该在我看来使用@Html.LabelFor()因为它不可重用。这是我如何使用它的一个例子。

<div class="form-group">
    <p>@Html.LabelFor(p => p.ProductName, new { @class = "col-sm-12" })</p>
    <div class="col-sm-12">
        @Html.TextBoxFor(p => p.ProductName, new { @class = "form-control" })
    </div>
</div>

不确定我是否理解这种推理。

2 个答案:

答案 0 :(得分:2)

MVC始终是UI的一部分,UI中没有业务逻辑。 视图模型不是业务模型,它只是视图的数据,但它可以包含一些特定于UI的逻辑。

您的代码完全正常,因为它包含显示逻辑,即UI逻辑。 Html.LabelFor只是一个帮助程序(甚至不是一个很好的帮助程序),可以让您更快地生成HTML。它有助于提高工作效率和可维护性,您的经理应该对这些方面感兴趣。

这种类型的帮助程序可以通过小/粒度来考虑它们可重用的页面元素/小部件。但是您可以通过创建自己的Html Helpers(也可以使用预定义的帮助程序)来构建那些使用partials或直接在C#中构建它们。

答案 1 :(得分:0)

我可以理解你的同事对视图中逻辑的关注。像MVC这样的'separated presentation'设计模式的关键原则之一是分离组件有助于自动化测试。

表示组件中逻辑的参数是它减少了自动化测试可以覆盖的代码量,因为表示组件通常更难以进行自动化测试。

如果您的观看代码是简单的if (x == y) { show },那么就没有讨论。但是,考虑到你的逻辑稍微,更复杂,因为你是&&,我会问你如何以自动方式测试那个逻辑?这个逻辑在视图中的事实使得该测试比在非呈现组件(控制器等)中更难。实际上,这需要手动测试或通过像Selenium这样的前端测试框架进行测试。这两种方法都比自动化单元或集成测试更昂贵。

也就是说,如果自动化测试不是您的团队所重视的,那么您可以根据需要在视图中添加尽可能多的逻辑。整个解决方案将通过前端进行测试,创建应用程序功能的机制对测试人员来说是不透明的。