MVC 3 - 在foreach循环内部,避免重复的html

时间:2011-08-21 20:53:41

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

我有一个使用“标签”的mvc视图,这些标签中的每一个都显示相同数据的不同形式(可从我的viewmodel获得)。数据显示如下:

<div id=tab1>
@foreach (Path p in Model.Paths.Where(r => r.PathType == "HR"))
   { 
(displays html and data)

}
</div>
<div id=tab2>
@foreach (Path p in Model.Paths.Where(r => r.PathType == "IT"))
   { 

 (displays html and data)

}
</div>

等等......因为每次迭代使用相同的html和命名变量(p),不重复这些值的最佳方法是什么?

2 个答案:

答案 0 :(得分:6)

使用自定义显示模板。

<强>共享\ DisplayTemplates \ Path.cshtml

@model YourApp.Model.Path
@* (displays html and data) *@

<强> MainView.cshtml

<div id=tab1>
   @Html.DisplayFor(model => model.HrPaths)
</div>
<div id=tab2>
   @Html.DisplayFor(model => model.ItPaths)}
</div>

您应该将VM中的Paths对象拆分为单独的属性,例如将.Where过滤器放入Controller中。

这样,你只有一个模板可以渲染出类型(因为它与两个属性的类型相同),你可以避免使用foreach循环,将HTML保存在一个地方等等。\

您还可以更进一步并在视图模型中创建Dictionary<string,IEnumerable<Path>>,其中是标签名称,值为预过滤的Path收集。

然后你的视图就变成了:

@Html.DisplayForModel()

然后是外部模板(你需要VM上的UIHint):

<div id=@Model.Key>
   @Html.DisplayFor(model => model.Value)
</div>

答案 1 :(得分:3)

让循环包含标签,如下所示:

@var i=0;
@foreach (string type in Model.PathTypes)
{ 
    @i++;
     <div id="tab@i">
         @foreach (Path p in Model.Paths.Where(r => r.PathType == type))
         {
             (displays html and data)
         }
     </div>

 }

我不知道MVC 3客户端语法,但你明白了。