В шаблоне редактора вызовите другой шаблон редактора с той же моделью - PullRequest
27 голосов
/ 25 июля 2011

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

52 голосов
/ 05 февраля 2014

Краткий ответ:

Используйте взамен 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.

...