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

pro*_*ock 3 asp.net asp.net-mvc razor asp.net-mvc-3

我有一个使用"标签"的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>
Run Code Online (Sandbox Code Playgroud)

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

RPM*_*984 6

使用自定义显示模板.

共享\ DisplayTemplates\Path.cshtml

@model YourApp.Model.Path
@* (displays html and data) *@
Run Code Online (Sandbox Code Playgroud)

MainView.cshtml

<div id=tab1>
   @Html.DisplayFor(model => model.HrPaths)
</div>
<div id=tab2>
   @Html.DisplayFor(model => model.ItPaths)}
</div>
Run Code Online (Sandbox Code Playgroud)

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

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

您还可以更进一步,Dictionary<string,IEnumerable<Path>>在视图模型中创建一个,其中是选项卡名称,值是预过滤的集合Path.

然后您的视图变为:

@Html.DisplayForModel()
Run Code Online (Sandbox Code Playgroud)

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

<div id=@Model.Key>
   @Html.DisplayFor(model => model.Value)
</div>
Run Code Online (Sandbox Code Playgroud)