Сложные модели и частичные представления - проблема с привязкой модели в ASP.NET MVC 3
У меня есть 2 модели в моем примере приложения MVC 3, SimpleModel
и ComplexModel
, как показано ниже:
public class SimpleModel
{
public string Status { get; set; }
}
public class ComplexModel
{
public ComplexModel()
{
Simple = new SimpleModel();
}
public SimpleModel Simple{ get; set; }
}
Я определил представления для этих моделей:
_SimplePartial.cshtml
:
@model SimpleModel
@Html.LabelFor(model => model.Status)
@Html.EditorFor(model => model.Status)
и Complex.cshtml
:
@model ComplexModel
@using (Html.BeginForm()) {
@Html.Partial("_SimplePartial", Model.Simple)
<input type="submit" value="Save" />
}
После отправки формы со случайным значением, введенным в поле Status
, это значение не привязано к моей модели. Поле Status
NULL
, когда я проверяю модель в действии моего контроллера:
[HttpPost]
public ActionResult Complex(ComplexModel model)
{
// model.Simple.Status is NULL, why ?
}
Почему он не привязан? Я не хочу наследовать модели. Должен ли я писать свои пользовательские привязки моделей для такого простого случая?
С уважением.
Ответы
Ответ 1
Вместо:
@Html.Partial("_SimplePartial", Model.Simple)
Я бы рекомендовал вам использовать шаблоны редактора:
@model ComplexModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Simple)
<input type="submit" value="Save" />
}
а затем поместите простое частичное внутри ~/Views/Shared/EditorTemplates/SimpleModel.cshtml
или внутри ~/Views/Home/EditorTemplates/SimpleModel.cshtml
, где Home
- это имя вашего контроллера:
@model SimpleModel
@Html.LabelFor(model => model.Status)
@Html.EditorFor(model => model.Status)
Конечно, если вы предпочитаете иметь частичное в каком-то определенном месте и не следовать соглашениям (зачем вам?), вы можете указать местоположение:
@Html.EditorFor(x => x.Simple, "~/Views/SomeUnexpectedLocation/_SimplePartial.cshtml")
тогда все будет в порядке, как и ожидалось.
Ответ 2
Как предлагает Daniel Hall в своем блоге, передайте ViewDataDictionary
с TemplateInfo
, где HtmlFieldPrefix
установлено имя свойство SimpleModel:
@Html.Partial("_SimplePartial", Model.Simple, new ViewDataDictionary(ViewData)
{
TemplateInfo = new System.Web.Mvc.TemplateInfo
{
HtmlFieldPrefix = "Simple"
}
})