DisplayNameFor()来自Model中的List <Object>

Jon*_*lis 82 c# asp.net-mvc model razor

我相信这很简单,我似乎无法找到正确的方法来显示模型中列表中项目的显示名称.

我的简化模型:

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; } }      
}
Run Code Online (Sandbox Code Playgroud)

和名称:

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; }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想创建一个表来显示一个人的所有名称,并获取DisplayNameFor FullName.明显,

@Html.DisplayNameFor(model => model.Names.FullName);
Run Code Online (Sandbox Code Playgroud)

不行,并且

@Html.DisplayNameFor(model => model.Names[0].FullName);  
Run Code Online (Sandbox Code Playgroud)

如果没有名字会破裂.这里有获取显示名称的"最佳方式"吗?

Tim*_* S. 127

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

@Html.DisplayNameFor(model => model.Names[0].FullName)
Run Code Online (Sandbox Code Playgroud)

它的工作原理是因为MVC解析表达式而不是实际执行它.这使得它可以找到正确的属性和属性,而无需在列表中有一个元素.

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

@Html.DisplayNameFor(dummy => Model.Names[0].FullName)
Run Code Online (Sandbox Code Playgroud)

就像这样:

@{ Namespace.Of.PersonNameViewModel dummyModel = null; }
@Html.DisplayNameFor(dummyParam => dummyModel.FullName)
Run Code Online (Sandbox Code Playgroud)

  • 我测试过,`FirstOrDefault()`可以使用空列表. (6认同)

T-m*_*oty 5

还有另一种方法,我想这更清楚:

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(); }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在视图中:

@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>
Run Code Online (Sandbox Code Playgroud)