我有一个大视图需要一些条件逻辑来决定在视图中间呈现几个html块中的哪一个。我的模型上有一个属性,它可以有几个不同的值来确定要输出的html。
我通常会将条件逻辑放在一个html帮助器中,但考虑到每个输出都是一大块html,我不确定在c#文件中转义它们会很棒。我也可以将逻辑放在动作中并呈现不同的视图,但鉴于大多数视图都是相同的,这似乎也不是很好。所以我在我的视图(或部分?)中留下了多个if语句,这些语句看起来也很丑陋(显然是不可测试的)。
这样做的最佳方式是什么?
(我正在使用MVC3以防万一我可以使用新的和时髦的东西!)
答案 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文件夹。