Как страница Razor может найти поле в DisplayNameFor? - PullRequest
0 голосов
/ 13 февраля 2019

Я удивлен, почему следующая таблица правильно находит имена.

@model IEnumerable<Member>
<table class="table">
  <thead>
    <tr>
      <th>
        @Html.DisplayNameFor(model => model.LastName)
      </th>
    <tr>
    ...

Модель, которую я установил, представляет собой массив типа Элемент , поэтому у модели нет свойства LastName .Элемент в списке делает!Разве это не должно быть

<th>
  @Html.DisplayNameFor(model => model.First().LastName)
</th>

Я никогда не замечал этого, пока не изменил свою модель просмотра на

public class IndexVm
{
  public IEnumerable<Member> Members { get; set; }
}

и не попытался

<th>
  @Html.DisplayNameFor(model => model.Members.LastName)
</th>

Это перестало работать, и когдаЯ исследовал, понял, что понимаю почему.Я не могу понять, как это могло работать раньше, хотя ...

  1. Может кто-нибудь объяснить, что с этим случилось?
  2. Является ли приведенная ниже единственная опция с учетом моей новой модели представления?
  3. Как компьютер должен знать, что отображать, если список пуст?

    @Html.DisplayNameFor (model => model.Members.FirstOrDefault () ?. LastName)

Так растерялся ...

1 Ответ

0 голосов
/ 14 февраля 2019

DisplayNameFor показывает имя свойства или строку, определенную в атрибуте отображения для свойства. Для

@Html.DisplayNameFor(model => model.LastName)

это работает, поскольку model имеет тип Member, а неIEnumerable<Member> в лямбда-выражении.

Вы можете использовать

@Html.DisplayNameFor(model => model.Members.FirstOrDefault().LastName)

Это все еще работает, даже если FirstOrDefault() вернет ноль, так как он использует метаданные из лямбда-выражений внутри, LastNameСамо свойство не доступно.

Если члены - это список IList<Member>, вы также можете использовать члены [0]

@Html.DisplayNameFor(model => model.Members[0].LastName)

См. здесь и здесь .

...