Подтвердить что ты не робот

DisplayNameFor() из списка <объект> в модели

Я считаю, что это довольно просто, я просто не могу найти правильный способ показать отображаемое имя для элемента в списке в моей модели.

Моя упрощенная модель:

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; }
}

Теперь я хотел бы сделать таблицу, чтобы показать все имена для человека, и получить DisplayNameFor FullName. Очевидно,

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

не работает, а

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

сломается, если нет имен. Есть ли "лучший способ" получить отображаемое имя здесь?

4b9b3361

Ответ 1

Это действительно работает даже без элементов в списке:

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

Это работает, потому что MVC анализирует выражение вместо фактического его выполнения. Это позволяет ему найти это свойство и атрибут, не требуя там быть элементом в списке.

Стоит отметить, что параметр (model выше) даже не нужно использовать. Это тоже работает:

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

Как это делает:

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

Ответ 2

Есть другой способ сделать это, и я думаю, это более понятно:

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>