2010-08-07 148 views
4

此代码存在于一个观点:该代码是业务逻辑还是表示逻辑?

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

乍看之下,它的显示逻辑,因此它的确定。但是这跟我坐得不对。

事情是,如果该组被分类为保险费,这意味着他们已付款,这显示联系信息是业务需求。

你们认为什么?这个逻辑应该移入HtmlHelper还是通过其他方式抽象出来?或者这是视图的预期用法?这段代码最好的做法是什么?

回答

9

我会产生一个ViewModel封装这个逻辑作为布尔DisplayContactInfo属性。这取决于你如何“干净”你想要你的观点。

+0

+1 IMO,这是ViewModel属性的完美使用 – Gregoire 2010-08-07 10:48:04

+1

我希望视图尽可能干净,在合理的范围内。我正在尝试为我们正在开发的项目制定最佳实践指南,并且希望确保我提出的建议合理有效。 – DaveDev 2010-08-07 10:48:47

+0

我认为最好的解决方案是创建一个新的助手,如下所示,而不是添加标志到模型中:如果我需要添加一个新的“检查”,我必须改变模型,这是不正确的。最好添加一个新的Helper,这个Helper也适用于这个范围,而不是为模型添加上千个标志 – 2011-03-29 16:19:51

1

我肯定会把它移到ViewHelper中。这是因为一旦你开始在views-aspx文件中编写视图逻辑,你就开始创建'tag soup',这会降低代码的可理解性,从而增加维护成本。

使用ViewHelpers来封装您的视图逻辑的另一个好处是,它还使您的应用程序更易于进行单元测试。所以给你上面的代码我会在你的视图中使用它在像这样一个视图助手,

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); %> 

这种技术的结果的看法避免'标签汤',更可维护和巨大的单位可测试。