我有一个嵌套类,例如:
public class Jar
{
public IEnumerable<NailClippings> Nails { set; get; }
public IEnumerable<People> Donors { set; get; }
}
我的控制器通过了一个Jar
在我看来,字符串类型为
@model Test.ViewModels.Jar
我可以循环浏览内容Nails
and Donors
很容易用这样的东西
@foreach(var item in Model.Nails)
我的问题是使用 HTML 帮助程序为我生成显示名称
@Html.DisplayNameFor(model => model.Nails.Length)
我想出了一个解决方案,将内部嵌套类的类型更改为List
, 附加.ToList()
在我的查询结束时并将该行更改为
@Html.DisplayNameFor(model => model.Nails[0].Length)
被迫使用List
并有一个索引[0]
显示名字对我来说很愚蠢。是否有引用内部嵌套类属性的替代方法?
Edit: View
<table>
<tr>
<th>@Html.DisplayNameFor(model => model.Nails[0].Length)</th>
.
.
</tr>
@foreach(var item in Model.Nails){
<tr>
<td>@Html.DisplayFor(modelItem => item.Length</td>
.
.
</tr>
}
</table>
您不需要在视图中编写任何循环。这让他们变得如此丑陋。
只需为集合类型定义相应的显示模板即可。例如你会创建~/Views/Shared/DisplayTemplates/NailClippings.cshtml
将强类型化为集合的单个元素的部分视图:
@model NailClippings
<tr>
<td>
@Html.DisplayFor(x => x.Length)
</td>
.
.
</tr>
现在在你的主视图中它就像这样简单:
@model Jar
<table>
<thead>
<tr>
<th>Length</th>
.
.
</tr>
</thead>
<tbody>
@Html.DisplayFor(x => x.Nails)
</tbody>
</table>
显示/编辑器模板按惯例工作。所以当你在主视图中使用时@Html.DisplayFor(x => x.Nails)
,ASP.NET MVC会分析的类型Nails
财产,并将看到它是一个IEnumerable<NailClippings>
收藏。所以它会先开始在里面寻找对应的显示模板~/Views/CurrentController/DisplayTemplates/NailClippings.cshtml
,然后在里面~/Views/Shared/DisplayTemplates/NailClippings.cshtml
最后它会回退到default display template http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html。选择模板后,ASP.NET MVC 将自动为您执行集合属性的每个元素的模板,这样您就不必担心在视图中编写一些循环、担心索引等问题。
这也适用于编辑器模板:@Html.EditorFor(x => x.Nails)
会寻找~/Views/Shared/EditorTemplates/NailClippings.cshtml
。这里的好处是生成的输入字段将具有正确的名称,并且当您提交表单时,默认模型绑定器将自动重新水合 HttpPost 操作作为请求参数的视图模型。
基本上,如果您尊重框架所遵循的约定,您将使您的生活变得更加轻松。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)