Как в представлении MVC Razor View отобразить упорядоченный список дочерних элементов в модели EF с помощью метода Html.EditorFor?
Чтобы отредактировать список дочерних элементов (с несколькими полями) из родительской модели Entity Framework, я использую стандартный синтаксис (элементы верхнего и нижнего колонтитула таблицы опущены для ясности) следующим образом.
<tbody>
@Html.EditorFor(model => model.ServiceCheckItems)
</tbody>
Для этого требуется представление редактирования в /Views/Shared/EditorTemplates/ServiceCheckItem.cshtml. Обратите внимание, что ServiceCheckItems - это дочерняя коллекция структуры сущностей в родительском элементе, а ServiceCheckItem - это экземпляр одного дочернего элемента, для которого должно совпадать имя шаблона редактора.
Вот упрощенный пример представления редактора. Каждое свойство отображается в редакторе или в скрытом поле, чтобы дочерние элементы можно было воссоздать для обратной публикации.
<tr>
<td>@Html.DisplayFor(model => model.CheckType)</td>
<td>
@Html.EditorFor(model => model.Notes, new { @class = "form-control" })
</td>
<td>
@* We must put every non-EditorFor field into a hidden to be remembered for post-back and the next render back to the client *@
@Html.HiddenFor(model => model.CheckType)
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.SequenceNumber)
</td>
</tr>
Этот подход работает хорошо, и я могу отправить родительскую модель обратно в различные действия со всеми связанными дочерними элементами, которые все еще прикреплены, снова отрендерить модель клиенту, чтобы пользователь мог выполнять больше работы.
Однако у дочерних элементов есть столбец упорядочивания, и они должны отображаться в этом порядке. Я не мог найти простого ответа, как представить список, упорядоченный по этому полю.
Модель основана на Entity Framework (динамический класс), который возвращается с использованием традиционного подхода.
return await _db.SomeTable.FindAsync(id);
Дочерние элементы либо существуют в базе данных, либо добавляются в Действие, когда пользователь впервые их создает. Они возвращаются клиенту, чтобы пользователь мог редактировать их содержимое.





После некоторого эксперимента я нашел решение, которое работает. В разделе кода представления я предоставляю отсортированную версию дочерних элементов, которые ожидает редактор.
ICollection<ServiceCheckItem> ServiceCheckItems = Model.ServiceCheckItems.OrderBy(i => i.SequenceNumber).ToList();
Затем редактору представляется модель следующим образом. Обратите внимание, что имя ServiceCheckItems должно соответствовать списку дочерних элементов, ожидаемых представлением редактора, в противном случае отрисованные дочерние элементы будут иметь неправильное имя префикса и, хотя и будут правильно повторно собраны для обратной передачи, не будут соответствовать имени списка родительского элемента и будут не прикрепляться.
<tbody>
@Html.EditorFor(model => ServiceCheckItems)
</tbody>
Надеюсь, это поможет другим. Если у вас есть лучший ответ, я бы хотел его увидеть.
Не работает - жалуется, что не является лямбда-выражением
Преобразуйте его в список или массив.
Почему бы просто не сделать
@Html.EditorFor(model => Model.ServiceCheckItems.OrderBy(i => i.SequenceNumber))?