Html.Editor Для сортировки дочерних элементов модели Entity Framework

Как в представлении 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);

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
72
1

Ответы 1

После некоторого эксперимента я нашел решение, которое работает. В разделе кода представления я предоставляю отсортированную версию дочерних элементов, которые ожидает редактор.

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))?

JuanR 13.04.2018 19:54

Не работает - жалуется, что не является лямбда-выражением

pixelda 17.04.2018 18:18

Преобразуйте его в список или массив.

JuanR 17.04.2018 18:21

Другие вопросы по теме