Подтвердить что ты не робот

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

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

4b9b3361

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

Я нашел это, посмотрев исходный код: http://aspnetwebstack.codeplex.com/, что отлично подходит для поиска этих странных особенностей MVC.