ASP.net MVC - использование EditorFor с одинаковым типом модели дважды - PullRequest
2 голосов
/ 06 декабря 2011

У меня есть следующая модель в MVC:

public class IndexViewModel
{
    public SubViewModel SubViewModel { get; set; }
}

В моем представлении индекса я делаю следующее, чтобы отобразить редактор для SubViewModel:

Index.cshtml

@model IndexViewModel

@Html.EditorFor(m => m.SubViewModel)

В моем файле SubViewModel.cshtml я пытался сделать следующее:

EditorTemplates / SubViewModel.cshtml

@model SubViewModel

@Html.EditorForModel("SubViewModelForm")

По сути, я хочу разделить мой редактор на две части.Первый шаблон редактора создаст форму, а внутренний - все поля формы.Проблема в том, что внутреннее представление никогда не отображается.

Как будто MVC понимает, что я уже звонил в EditorFor для этой модели, и мешает мне сделать это снова.Есть ли способ, которым я могу заставить это работать?

РЕДАКТИРОВАТЬ

Я думал, что напечатал то, что происходило ясно, но я не думаю.

Я хочу использовать два шаблона для отображения одной модели.В первом шаблоне я хочу отобразить форму и кнопку отправки, а также несколько контейнерных элементов.

Во втором шаблоне я хочу отобразить все поля формы.

Индекс.cshtml @ Html.EditorFor (m => m.SubViewModel) -> отобразить форму и контейнер

SubViewModel.cshtml @ Html.EditorForModel ("SubViewModelForm") -> отобразить поля формы

Проблема в том, что второй вызов (@ Html.EditorForModel ("SubViewModelForm")), похоже, ничего не делает.Он никогда не отображает никаких тегов.MVC игнорирует его.

Причина, по которой я хочу сделать это, заключается в том, что я собираюсь опубликовать эту форму с помощью вызова ajax.Если все в порядке (состояние модели корректно), я хочу вернуть данные JSON в представление.Если модель недействительна, я хочу вернуть частичное представление только с полями формы.Таким образом, мне не нужно снова подключать все мои обработчики событий.Я могу просто заменить поля формы вместо всего представления.

Ответы [ 2 ]

5 голосов
/ 06 декабря 2011

Я полагаю, что это как-то связано с TemplateInfo.Visited методом.Проще говоря, вы не можете использовать EditorFor два раза для одного и того же объекта.Вот почему mvc игнорирует ваш второй EditorForModel, так как редактор для SubViewModel уже визуализирован (из Index.cshtml).

Я не знаю, является ли это лучшим обходным путем, но первое, что приходит на ум, - визуализировать второй шаблон как частичное представление, вызывая Html.Partial

@model SubViewModel

@Html.Partial("SubViewModelForm", Model)
1 голос
/ 06 декабря 2011

После прочтения вашей дополнительной информации я считаю, что было бы лучше использовать шаблон шаблона контейнера.

/* Container.cshtml (container markup and call to editor template) */
<fieldset>                    
    @Html.EditorForModel()
</fieldset>

/* SubViewModel.cshtml editor template */
@model SubViewModel

@Html.DisplayFor(x => x.Property1)
@Html.EditorFor(x => x.Property1)
...

/* Index.cshtml */
@Html.RenderPartial("Container.cshtml", Model.SubViewModel)
...