В шаблоне редактора вызовите другой шаблон редактора с той же моделью

У меня есть шаблон редактора, и в этом шаблоне я хочу вызвать другой шаблон редактора с той же моделью (т. Е. Вложенный), но, похоже, он не отображается.
то есть. \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.

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