【问题标题】:Separation of Concerns, Business logic vs Presentation logic关注点分离,业务逻辑与表示逻辑
【发布时间】:2012-10-11 16:44:50
【问题描述】:

在 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,还是应该有两种视图,一种给OK客户,一种给大客户?

【问题讨论】:

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


    【解决方案1】:

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

    如果account&lt;3000 应该在您的业务逻辑中定义,那么说客户是“可以的”,无论它可能在哪里——模型或业务层,它可以在哪里进行单元测试和重用。然后,您可以在视图中使用客户状态枚举来在标记中执行此切换:

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

    【讨论】:

      【解决方案2】:

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

      使用您提供的示例,我会坚持在视图中使用if..else 块,而最终只有一个&lt;p&gt;,并将其文本设置在变量中。像

       @string text = account<3000? "you are ok":"you are great";             
       <p>@text</p>
      

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

      总而言之,我不认为在视图中有这样的块来设置正确的 html 是“非法的”。只要案例之间的差异小于共享代码,使用if..else 块的视图就没有错。

      【讨论】:

      • 您所说的“用视图模型扩展模型”是什么意思?
      • 和你做的一模一样,可能是:创建一个新类,可能继承他的基类(用户?),或者包含它,相关文本可作为属性访问,其值为根据帐户的值设置。
      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        不管您的技术堆栈如何,您实质上是说如果客户的帐户少于 3000,则客户是好的,否则他们是好的。

        所以CustomerState(换成更好的词,AccountState?)可以是Good 或Great。

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

        【讨论】:

          猜你喜欢
          • 2011-07-03
          • 2013-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-04
          • 2011-03-04
          • 2011-11-03
          相关资源
          最近更新 更多