mvc视图中的条件逻辑vs htmlhelper vs action

时间:2011-03-16 17:18:43

标签: asp.net-mvc asp.net-mvc-3

我有一个大视图需要一些条件逻辑来决定在视图中间呈现几个html块中的哪一个。我的模型上有一个属性,它可以有几个不同的值来确定要输出的html。

我通常会将条件逻辑放在一个html帮助器中,但考虑到每个输出都是一大块html,我不确定在c#文件中转义它们会很棒。我也可以将逻辑放在动作中并呈现不同的视图,但鉴于大多数视图都是相同的,这似乎也不是很好。所以我在我的视图(或部分?)中留下了多个if语句,这些语句看起来也很丑陋(显然是不可测试的)。

这样做的最佳方式是什么?

(我正在使用MVC3以防万一我可以使用新的和时髦的东西!)

3 个答案:

答案 0 :(得分:4)

像这样的恕我直言逻辑对于一个观点是好的:

@if (Model.ShouldShowSomeSection)
{
    ... some large chunk of HTML
}
else
{
    ... some alternative
}

答案 1 :(得分:4)

我通常在他们自己的部分中放置单独的视觉块。然后我的视图有条件地使用Html.Partial调用每个部分。这样可以让您远离臃肿。

一般来说,我试图避免包含多个元素的Html.Helpers。

类似的东西:

@if(Model.HasA) 
{
    @Html.Partial("widgetdetails-hasa")
}

@if(Model.HasB)
{ 
    @Html.Partial("widgetdetails-hasb")
}
// etc

答案 2 :(得分:0)

我同意@bmancini的回答,但是这与我的做法略有不同:

在逻辑上,我会将那些“要呈现的多个html块”分组为不同的局部视图:

 _partialViewA.cshtml and _partialViewB.cshtml 

然后我将使用扩展方法,并将我的逻辑保存在Helpers文件夹中,然后将HTML子文件夹保存如下:

    using System.Web.Mvc.Html;

    public static class SomeViewHelper
    {
        public static MvcHtmlString OutputHtmlString(this HtmlHelper helper , SomeModel model)
        {
          if(model.HasA)
          {
            return helper.Partial("_partialViewA", model)
          }
          if(model.HasB)
          {
            return helper.Partial("_partialViewB", model)
          }
        }   
    }

这将从视图中删除所有逻辑,而现在只包含以下代码:

    @Html.OutputHtmlString(Model);

至少这将消除“丑陋”并避免条件语句,并且还避免“转义C#代码中的html缺陷” ... 当然,我必须在视图中使用@using语句引用Helpers.Html文件夹。