В шаблоне редактора вызовите другой шаблон редактора с той же моделью
У меня есть шаблон редактора, и в этом шаблоне я хочу вызвать другой шаблон редактора с той же моделью (т. Е. Вложенный), но, похоже, он не отображается.
то есть. \EditorTemplates\Template1.cshtml
@model foo
// insert code here to edit the default fields.
// display extra fields via another editor template.
@Html.EditorForModel("Template2") // or @Html.EditorFor(m => m, "Template2")
и \EditorTemplates\Template2.cshtml
@model foo
@Html.TextBoxFor(m => m.Name)
Я уверен, что кто-то спросит почему? Ну, вложенный шаблон будет отображаться только в том случае, если выполняется условие (т. Е. @If (@Model.IsConditionMet) { .... }), но я упустил это из своего прототипа для простоты.
1 ответ
Короткий ответ:
использование Html.Partial
вместо.
Итак, в вашем файле Template1.cshtml:
@model foo
// insert code here to edit the default fields.
// display extra fields via another editor template.
@Html.Partial("EditorTemplates/Template2", Model)
Длинный ответ:
Это, к сожалению, кажется, из-за дизайна. MVC отслеживает модели, которые были отрисованы, и если ваша модель уже была отрисована шаблоном, она не будет делать это дважды, даже если шаблон отличается. Следовательно, почему второй @Html.EditorForModel("Template2")
просто ничего не делает.
В частности, он отслеживается в ViewData.TemplateInfo.VisitedObjects
, что является внутренним полем, поэтому у вас нет надежды изменить его после факта. Цель этого поля - предотвратить бесконечную рекурсию. Благородно, но раздражает тем, что не учитывает используемый шаблон.
Я выяснил это, взглянув на исходный код, который отлично подходит для нахождения этих странных особенностей MVC.