Сложные модели и частичные представления - проблема связывания моделей в ASP.NET MVC 3 - PullRequest
43 голосов
/ 04 марта 2011

В моем примере приложения MVC 3 есть 2 модели 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 ?
}

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

С уважением.

Ответы [ 2 ]

60 голосов
/ 04 марта 2011

Вместо:

@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")

тогда все встанет на свои места, как и ожидалось.

25 голосов
/ 16 июля 2014

Как предлагает Даниэль Холл в своем блоге , передайте ViewDataDictionary с TemplateInfo, где HtmlFieldPrefix установлено как имя свойства SimpleModel:

 @Html.Partial("_SimplePartial", Model.Simple, new ViewDataDictionary(ViewData)
    {
        TemplateInfo = new System.Web.Mvc.TemplateInfo
        {
            HtmlFieldPrefix = "Simple"
        }
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...