此代码存在于视图中:
if (Model.Group.IsPremium && null != Model.Group.ContactInfo)
{
Html.RenderPartial("ContactInfo", Model.Group.ContactInfo);
}
乍一看,这是演示逻辑,所以没关系。但它并不适合我。
问题是,如果该群组被归类为高级版,那么显示联系信息是业务要求,这意味着他们已付款。
你们觉得怎么样?这个逻辑应该转移到HtmlHelper中还是通过其他方式抽象出来?或者这是View的预期用途?这段代码最好的做法是什么?
答案 0 :(得分:9)
我将生成一个ViewModel,它将此逻辑封装为布尔DisplayContactInfo属性。这取决于你希望你的观点“干净”。
答案 1 :(得分: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); %>
这种技术可以产生避免“标签汤”的视图,更易于维护且可以进行单元测试。