38 votes

ASP.NET MVC - Mélange de liaisons de modèle personnalisées et par défaut

J'ai un type:

public class IssueForm
{
    Order Order {get; set;}
    Item Item {get; set;}
    Range Range {get; set;}
}

J'ai créé un modèle de liaison personnalisé en raison des exigences de la Commande et de l'Élément, mais la Gamme peuvent toujours utiliser le Modèle de Classeur par Défaut.

Est-il possible de l'intérieur de mon modèle de liaison personnalisé pour appeler le modèle de classeur par défaut pour retourner un objet de la Plage? Je pense que je viens juste d'installation ModelBindingContext correctement, mais je ne sais pas comment.


MODIFIER

En regardant le premier commentaire et réponse: il semble que l'héritage du modèle de classeur par défaut pourrait être utile.

Pour ajouter plus de détails pour ma configuration pour l'instant j'ai:

public IssueFormModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        Order = //code to pull the OrderNumber from the context and create an Order
        Item = //code to pull the ItemNumber from the context and create an Item

        IssueForm form = IssueFormFactory.Create(Order, Item);

        form.Range = // ** I'd like to replace my code with a call to the default binder **

        return form
    }
}

Ce peut être une façon stupide de le faire... c'est mon premier modèle de classeur. Il suffit de pointer mon actuel de mise en œuvre.


EDIT #2

Ainsi les réponses à remplacer BindProperty de travailler si je peux l'accrocher dans un "je suis tout à fait de la liaison" méthode et d'appeler la méthode de Fabrique, avec les propriétés.

Je suppose que je devrais vraiment regarder les DefaultModelBinder mise en œuvre et d'arrêter d'être stupide.

25voto

eu-ge-ne Points 17847

Essayez quelque chose comme ça:

 public class CustomModelBinder :  DefaultModelBinder {
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) {
        if(propertyDescriptor.Name == "Order") {
            ...
            return;
        }

        if(propertyDescriptor.Name == "Item") {
            ...
            return;
        }

        base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
    }

}
 

6voto

Konstantin Points 1118

Je pense que j'aurais enregistré deux classeurs de modèles personnalisés différents, un pour Order et un pour Item, et laisser le classeur de modèles par défaut gérer la plage et le IssueForm.

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