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