MVC 业务逻辑与 Display/UI 逻辑
MVC Business Logic versus Display/UI Logic
所以,我使用下面的代码在初始加载时在页面上显示几个元素。
<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>
我也不确定我是否理解这个推理。
MVC 始终是 UI 的一部分,并且 UI 中没有业务逻辑。 视图模型不是业务模型,它只是视图的数据,但它可以包含一些UI特定逻辑。
您的代码完全没问题,因为它包含显示逻辑,即 UI 逻辑。 Html.LabelFor
只是一个帮手(甚至不是一个好帮手),它可以让你更快地生成 html。它有助于提高生产力和可维护性,您的经理应该对这些方面感兴趣。
此类助手是 small/granular 认为它们可重用页面 elements/widgets 的方式。但是您可以通过创建自己的 Html Helpers(您也可以在其中使用预定义的帮助程序)使用部分或直接在 C# 中构建它们。
我能理解您的同事对视图中逻辑的关注。 “separated presentation”设计模式(如 MVC)的关键原则之一是分离组件有利于自动化测试。
表示组件中逻辑的反对意见是它减少了自动化测试可以覆盖的代码量,因为表示组件通常更难进行自动化测试。
如果您的视图代码是一个简单的 if (x == y) { show }
那么就没有讨论了。但是,考虑到您的逻辑稍微复杂一些,因为您正在 &&
'ing,我想问您如何以自动化方式测试该逻辑?这个逻辑在视图中的事实使得该测试比在非表示组件(控制器等)中更难。实际上,这需要手动或通过 Selenium 这样的前端测试框架进行测试。这两种方法都比自动化单元或集成测试更昂贵。
就是说,如果您的团队不重视自动化测试,那么您可以根据需要在视图中添加尽可能多的逻辑。整个解决方案将通过前端进行测试,创建应用程序功能的机制对测试人员来说是不透明的。
所以,我使用下面的代码在初始加载时在页面上显示几个元素。
<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>
我也不确定我是否理解这个推理。
MVC 始终是 UI 的一部分,并且 UI 中没有业务逻辑。 视图模型不是业务模型,它只是视图的数据,但它可以包含一些UI特定逻辑。
您的代码完全没问题,因为它包含显示逻辑,即 UI 逻辑。 Html.LabelFor
只是一个帮手(甚至不是一个好帮手),它可以让你更快地生成 html。它有助于提高生产力和可维护性,您的经理应该对这些方面感兴趣。
此类助手是 small/granular 认为它们可重用页面 elements/widgets 的方式。但是您可以通过创建自己的 Html Helpers(您也可以在其中使用预定义的帮助程序)使用部分或直接在 C# 中构建它们。
我能理解您的同事对视图中逻辑的关注。 “separated presentation”设计模式(如 MVC)的关键原则之一是分离组件有利于自动化测试。
表示组件中逻辑的反对意见是它减少了自动化测试可以覆盖的代码量,因为表示组件通常更难进行自动化测试。
如果您的视图代码是一个简单的 if (x == y) { show }
那么就没有讨论了。但是,考虑到您的逻辑稍微复杂一些,因为您正在 &&
'ing,我想问您如何以自动化方式测试该逻辑?这个逻辑在视图中的事实使得该测试比在非表示组件(控制器等)中更难。实际上,这需要手动或通过 Selenium 这样的前端测试框架进行测试。这两种方法都比自动化单元或集成测试更昂贵。
就是说,如果您的团队不重视自动化测试,那么您可以根据需要在视图中添加尽可能多的逻辑。整个解决方案将通过前端进行测试,创建应用程序功能的机制对测试人员来说是不透明的。