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

Сложные модели и частичные представления - проблема с привязкой модели в 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 ?
}

Почему он не привязан? Я не хочу наследовать модели. Должен ли я писать свои пользовательские привязки моделей для такого простого случая?

С уважением.

4b9b3361

Ответ 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"
        }
    })