这段代码是业务逻辑还是展示逻辑?

4

这段代码存在于一个视图中:

       if (Model.Group.IsPremium && null != Model.Group.ContactInfo)
       {
           Html.RenderPartial("ContactInfo", Model.Group.ContactInfo);
       }

乍一看,这是演示逻辑,所以没问题。但是我不太满意。

问题在于,如果群组被归类为高级别(即已付费),那么显示联系信息就是业务要求。

你们觉得呢?这个逻辑应该移到HtmlHelper中,还是通过其他方式抽象出来?或者这是View的预期用法?对于这段代码,最好的做法是什么?

2个回答

9

我会创建一个ViewModel来封装这个逻辑,其中包含一个布尔类型的DisplayContactInfo属性。这取决于您想要视图有多清晰。


1
我希望视图尽可能干净,但也要在合理的范围内。我正在为我们正在开展的项目编写最佳实践指南,我想确保我提出的建议是有意义和合理的。 - DaveDev
我认为最好的解决方案是创建一个新的 Helper,如下所示,而不是将标志添加到模型中:如果我需要添加一个新的“检查”,我必须更改模型,这是不正确的。最好添加一个新的 Helper,也是为此目的而制作的,而不是向模型添加成千上万的标志。 - Massimiliano Peluso

1

我肯定会将这个移入到一个ViewHelper中。这是因为一旦你开始在视图 - aspx文件 - 中编写视图逻辑,你就开始创建“标记汤”,这会降低代码可读性,从而增加维护成本。

使用ViewHelpers封装您的视图逻辑的另一个好处是它还使您的应用程序更容易进行单元测试。因此,给定您上面的代码,我会像这样在ViewHelper中使用它:

using System.Linq;
using System.Web.Mvc;
using System;
using System.Text;
using System.Web.Mvc.Html; //Need this for Html helper extension method

public static class GroupViewHelper
{
    public static void ShowContactInfo(this HtmlHelper helper, ModelType model)
    {
        if (model.Group.IsPremium && null != model.Group.ContactInfo)
        {
            //Do your rendering here.
        }
    }

   // ... your other ViewHelper methods here.
}

接下来,在你的视图中,我会这样调用这个帮助方法,

<% Html.ShowContactInfo(Model); %>

这种技术可以获得避免“标签汤”的视图,使其更易于维护并且非常适合单元测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接