关注点分离,业务逻辑与表示逻辑

时间:2012-10-11 16:44:51

标签: asp.net-mvc model-view-controller separation-of-concerns

在MVC中或者一般情况下,当尝试将业务逻辑与视图分开时,从视图中删除逻辑方面你走了多远?视图应该是零逻辑吗?是否应该有多个静态视图,其中包含变量填充的简单“漏洞”,或者我们是否可以根据具体情况输出不同的html的单个视图?

<html>
    <body>
        <h1>Your name is @uname</h1>
        @if(account<3000) { 
             <p>You are an ok customer</p>
        } else { 
             <p>You are a great customer</p>
        }
    </body>
</html>

以上是否可以,或者应该有两个视图,一个是OK客户,一个是优秀客户?

4 个答案:

答案 0 :(得分:3)

在视图中有一些基本逻辑是好的,只要它只关注您正在显示的数据的显示。我可能会更改您的示例以删除“ok”或“great”客户的定义,并在模型中更早地设置它。

如果在您的业务逻辑中定义account<3000,那么客户就是“ok”,无论在哪里 - 模型或业务层,可以对其进行单元测试和重复使用。然后,您可以在视图中使用客户状态枚举来在标记中执行此切换:

if (@Model.CustomerStatus == CustomerStatus.Ok)
{
    <p>You are an ok customer</p>
}
else
{
    <p>You are a great customer</p>
}

答案 1 :(得分:0)

在我看来,有一个额外的视图是错误的,因为它会导致你在许多情况下复制HTML代码。

根据您提供的示例,我坚持在视图中使用if..else块,最终只有一个<p>,并将其文本设置在变量中。

之类的东西
 @string text = account<3000? "you are ok":"you are great";             
 <p>@text</p>

当然,还有另一个解决方案:使用ViewModel类扩展模型,该类具有TypeOfCustomer字符串属性,并带有相关文本。

总结一下,我不认为它是&#34; illega&#34;在视图中有这样的块,以设置正确的html。只要案例之间的差异小于共享代码,使用if..else块来监视一个视图就没有错。

答案 2 :(得分:0)

在经典的MVC实现中,视图将包含表示逻辑。 MVC设计模式由两层组成:模型层和表示层。视图和控制器构成了表示层的最大部分,其中控制器处理用户交互并查看用户界面的处理。

因为你实际上不能(好......你可以,但在实践中它是半不可能的)实现Web应用程序的经典MVC模式,在ASP.NET MVC框架中,你通常有两种方法来解决这个问题:

  • Rails-like:你在控制器中推送表示逻辑,并且几乎没有逻辑地保留模板。但我会认为这是一个糟糕的选择,因为带有rails实现的issues

  • ViewModels.此结构允许您包含与控制器分开的表示逻辑。它实际上有点错误,因为在ASP.NET MVC文档中描述的ViewModel实际上是经典视图应该是什么。您将表示逻辑放在ViewModel个实例中,并使用“视图”作为模板,现在可以包含尽可能少的表示逻辑。

答案 3 :(得分:0)

无论您的技术堆栈如何,您基本上都说的是,如果客户的账户少于3000,客户就会很好,否则他们就很棒。

因此,Customer State(用更好的词AccountState?换掉)可以是GoodGreat

State因此是Customer的一个方面,应该是Customer上的属性/方法。