我有一个使用“标签”的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),不重复这些值的最佳方法是什么?
答案 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客户端语法,但你明白了。