Привет, я пытаюсь создать приложение, в котором вы можете создавать формы для регистрации событий и т.д. У меня есть модель Form, которая имеет ICollection of Fields. Поля абстрактны и производят такие вещи, как Checkbox или TextInput и т.д. У меня есть так, что полиморфное поведение работает для моего списка полей, и я могу получить шаблоны EditorFor для каждого типа поля, чтобы я мог делать EditorFor во всем списке, и он будет генерировать список с правильным шаблоном.
Это очень удобно и очень просто с инфраструктурой сущности, но моя проблема в том, что я хочу иметь возможность делать некоторую визуализацию между каждым полем, которое отображается на экране. Поля должны отображаться в сетке строк/столбцов, и каждое поле имеет свойства Row/Size. Единственный способ, которым я понял, как использовать шаблоны EditorFor в списке полей, выглядит следующим образом:
<div class="row">
@Html.EditorFor(form => form.Fields)
</div>
Но мне нужно иметь какой-то цикл, вместо которого я могу контролировать, где этот шаблон получает визуализацию. Например, они сортируются по строке, поэтому я могу проверить, добавили ли мы еще поля в одну строку или если мне нужно создать новую строку.
Если бы мне пришлось это решить завтра, я бы просто превратил его в статические html-divs, а затем переместил его с помощью jQuery, но я чувствую себя ужасно. Другим способом было бы сохранить текущую строку, в которой мы находимся в представлении, но затем для каждого шаблона поля (например, 12) я бы просто копировал один и тот же логический код...
Любые лучшие идеи будут оценены.
EditorFor использует Tampletes, которые хранятся в Views/Shared/EditorTemplates. Вы можете определить свои собственные шаблоны для своего типа или переопределить существующие. Проверьте это репо: https://github.com/danmalcolm/mvc-razor-display-and-editor-templates/tree/master/src/DemoMvcApp/Views/Shared/EditorTemplates
Я думаю, что в вашем случае вы хотите переопределить Object.cshtml. Например: https://github.com/danmalcolm/mvc-razor-display-and-editor-templates/blob/master/src/DemoMvcApp/Views/Shared/EditorTemplates/Object.cshtml Я прав?
Моим временным решением было просто зациклиться на строках в моем главном представлении. Я сохраняю текущий указатель строки в ViewBag, а затем в шаблонах редактора я проверяю, является ли Model.Row == ViewBag.CurrRow. Мне это не очень нравится, потому что я буду перебирать все шаблоны для полей для каждой строки, которая у меня есть.
Я думаю, что постоянным решением будет пользовательский ViewModel, который имеет поля, разделенные на строки, поэтому у меня может быть шаблон редактора для каждой строки.
Я также выяснил, что редактор ForFor на Model.Fields фактически не вызывает редактор EditorFor во всех полях, он вызывает его на типе ICollection, который, в свою очередь, вызывает шаблоны редактора полей. Поэтому я уверен, что могу просто создать свой собственный ICollection EditorTemplate с логикой Row, в которой я нуждаюсь.