DisplayNameFor()从模型中的List <Object>

我相信这是非常简单的,我似乎无法find正确的方式来显示我的模型内列表中的项目的显示名称。

我的简化模型:

public class PersonViewModel { public long ID { get; set; } private List<PersonNameViewModel> names = new List<PersonNameViewModel>(); [Display(Name = "Names")] public List<PersonNameViewModel> Names { get { return names; } set { names = value; } } } 

和名称:

 public class PersonNameViewModel { public long ID { get; set; } [Display(Name = "Set Primary")] public bool IsPrimary { get; set; } [Display(Name = "Full Name")] public string FullName { get; set; } } 

现在我想创build一个表来显示一个人的所有名字,并获取DisplayNameFor FullName。 明显,

 @Html.DisplayNameFor(model => model.Names.FullName); 

将无法正常工作

 @Html.DisplayNameFor(model => model.Names[0].FullName); 

如果没有名字就会中断 在这里获得显示名称是否有“最好的方法”?

这实际上工作,即使没有在列表中的项目:

 @Html.DisplayNameFor(model => model.Names[0].FullName) 

它的工作原理是MVCparsingexpression式而不是实际执行它。 这可以让它find正确的属性和属性,而不需要在列表中有一个元素。

值得注意的是,参数(上面的model )甚至不需要使用。 这也适用于:

 @Html.DisplayNameFor(dummy => Model.Names[0].FullName) 

如下所示:

 @{ Namespace.Of.PersonNameViewModel dummyModel = null; } @Html.DisplayNameFor(dummyParam => dummyModel.FullName) 

还有另外一种方法可以做到这一点,我想这更清楚了:

 public class Model { [Display(Name = "Some Name for A")] public int PropA { get; set; } [Display(Name = "Some Name for B")] public string PropB { get; set; } } public class ModelCollection { public List<Model> Models { get; set; } public Model Default { get { return new Model(); } } } 

然后,在视图中:

 @model ModelCollection <div class="list"> @foreach (var m in Model.Models) { <div class="item"> @Html.DisplayNameFor(model => model.Default.PropA): @m.PropA <br /> @Html.DisplayNameFor(model => model.Default.PropB): @m.PropB </div> } </div>