45 votes

Modèles complexes et vues partielles - problème de liaison de modèle dans ASP.NET MVC 3

J'ai 2 modèles dans mon exemple MVC 3, SimpleModel et ComplexModel, illustré ci-dessous:

public class SimpleModel
{
    public string Status { get; set; }
}

public class ComplexModel
{
    public ComplexModel()
    {
        Simple = new SimpleModel();
    }

    public SimpleModel Simple{ get; set; }
}

J'ai des vues définies pour ces modèles:

_SimplePartial.cshtml:

@model SimpleModel

@Html.LabelFor(model => model.Status)
@Html.EditorFor(model => model.Status)

et Complex.cshtml:

@model ComplexModel

@using (Html.BeginForm()) {

    @Html.Partial("_SimplePartial", Model.Simple)
    <input type="submit" value="Save" />
}

Après avoir soumis le formulaire, avec une valeur aléatoire est entré en Status champ, la valeur n'est pas lié à mon modèle. L' Status champ est - NULL quand je suis à la vérification du modèle dans mon action de contrôleur:

[HttpPost]
public ActionResult Complex(ComplexModel model)
{
    // model.Simple.Status is NULL, why ?
}

Pourquoi n'est-il pas appliqué ? Je ne veux pas hériter de modèles. Dois-je écrire mon modèle personnalisé liants pour de tels cas simple ?

Ce qui concerne.

62voto

Darin Dimitrov Points 528142

Au lieu de:

@Html.Partial("_SimplePartial", Model.Simple)

Je vous recommande de vous à l'aide de l'Éditeur de modèles:

@model ComplexModel
@using (Html.BeginForm()) 
{
    @Html.EditorFor(x => x.Simple)
    <input type="submit" value="Save" />
}

et puis mettre les partielles simples à l'intérieur d' ~/Views/Shared/EditorTemplates/SimpleModel.cshtml ou à l'intérieur d' ~/Views/Home/EditorTemplates/SimpleModel.cshtmlHome est le nom de votre contrôleur:

@model SimpleModel
@Html.LabelFor(model => model.Status)
@Html.EditorFor(model => model.Status)

Bien sûr, si vous préférez avoir la partielle dans certains endroit spécial et de ne pas suivre les conventions (pourquoi?) vous pouvez spécifier l'emplacement:

@Html.EditorFor(x => x.Simple, "~/Views/SomeUnexpectedLocation/_SimplePartial.cshtml")

ensuite, tout sera mis en place comme prévu.

26voto

toralux Points 11

Comme Daniel Hall le suggère dans son blog, transmettez un ViewDataDictionary avec un TemplateInfoHtmlFieldPrefix est défini sur le nom de la propriété SimpleModel:

  @Html.Partial("_SimplePartial", Model.Simple, new ViewDataDictionary(ViewData)
    {
        TemplateInfo = new System.Web.Mvc.TemplateInfo
        {
            HtmlFieldPrefix = "Simple"
        }
    })
 

http://danielhalldev.wordpress.com/2013/08/23/partial-views-and-nested-mvc-model-binding/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X