Asp.net mvc mvc视图中的条件逻辑vs htmlhelper vs action 我有一个大视图,需要一些条件逻辑来决定在视图中间渲染哪些HTML块。我的模型上有一个属性,它可以有几个不同的值,这些值决定要输出的html

Asp.net mvc mvc视图中的条件逻辑vs htmlhelper vs action 我有一个大视图,需要一些条件逻辑来决定在视图中间渲染哪些HTML块。我的模型上有一个属性,它可以有几个不同的值,这些值决定要输出的html,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我通常会将条件逻辑放在html助手中,但考虑到每个输出都是一个相当大的html块,我不确定在c#文件中转义这些逻辑是否很好。我也可以把逻辑放在行动中,提出不同的观点,但鉴于大多数观点是相同的,这似乎也不太好。因此,在我看来,我留下了多个if语句(或部分?),它们看起来也很丑陋(显然是不稳定的) 这样做的最佳方式是什么 (我正在使用MVC3,以防我可以使用一些新的和时髦的东西!)这样的逻辑对于视图来说很好: @if (Model.ShouldShowSomeSection) { ... s

我通常会将条件逻辑放在html助手中,但考虑到每个输出都是一个相当大的html块,我不确定在c#文件中转义这些逻辑是否很好。我也可以把逻辑放在行动中,提出不同的观点,但鉴于大多数观点是相同的,这似乎也不太好。因此,在我看来,我留下了多个if语句(或部分?),它们看起来也很丑陋(显然是不稳定的)

这样做的最佳方式是什么


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

这样的逻辑对于视图来说很好:

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

我通常在它们自己的部分中放置单独的视觉块。然后,我的视图有条件地使用Html.partial调用每个部分。这可以防止主视图膨胀

一般来说,我尽量避免使用包含多个元素的Html.Helpers

比如:

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

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

我同意@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#code中逃避html漏洞”。。。
当然,我必须在视图中使用@using语句引用Helpers.Html文件夹。

如果您使用的是Razor,请尝试通过谷歌搜索“Razor声明性Html Helpers”,它们可能适合您的情况。。。他们可能不会。但是他们的新的和时髦的;-)我同意-包含多个元素的Html助手称为部分页面;-)