2010-02-19 10 views
2

Dans un classeur de modèle ASP.Net MVC, il est possible de créer un objet du type lié, puis de mettre à jour les propriétés qu'il contient.Liaison de données à un objet existant dans Asp.net MVC

par exemple.

public override object BindModel(ControllerContext controllerContext, 
    ModelBindingContext bindingContext) 
{ 
    ParentType boundModel = null; 
    if (bindingContext.ModelType == typeof(ParentType)) 
    { 
     var myFactory = new MyFactory(); 
     var someValue = bindingContext.ValueProvider.GetValue 
      ("someFieldId").AttemptedValue; 
     ChildType child = myFactory.Create(someValue); 
     BindModel(child); 
     boundModel = child; 
    } 
    return boundModel; 
} 

Dans ce code, je veux savoir s'il y a quelque chose de similaire à la bindModel (enfant) appel, un peu comme TryModelUpdate() d'un contrôleur?

+0

Quel est le cas d'utilisation? –

+0

J'ai deux classes enfant et celle qui est instanciée est basée sur une liste déroulante avec l'ID "someFieldId". Donc, je voudrais instancier la classe enfant en utilisant l'usine puis mettre à jour toutes les propriétés Parent du formulaire en utilisant un appel TryUpdateModel/BindModel. Je voudrais alors que le modèle lié transmis au contrôleur. –

Répondre

1

Je pense qu'une meilleure approche de votre problème serait de dériver de DefaultModelBinder (que je pense que vous êtes probablement) et de surcharger la méthode CreateModel plutôt que la méthode BindModel. En retournant votre objet Enfant à partir de cela, vous devriez suivre le chemin que vous recherchez.

+0

Cela ressemble à une solution parfaite. Je vais essayer et revenir à vous :-) –

0
public override object BindModel(ControllerContext controllerContext, 
           ModelBindingContext bindingContext) 
{ 
    ParentType boundModel = null; 
    if (bindingContext.ModelType == typeof(ParentType)) 
    { 
     var myFactory = new MyFactory(); 
     var someValue = bindingContext.ValueProvider 
             .GetValue("someFieldId").AttemptedValue; 
     ChildType child = myFactory.Create(someValue); 
     BindModel(child); 
     boundModel = child; 
    } 

    // change here 
    bindingContext.ModelMetadata.Model = boundModel; 
    return BindModel(controllerContext, bindingContext); 
} 

Que pensez-vous de cela?

+0

Malheureusement, la méthode 'BindModel (enfant)' n'existe pas. C'était le problème avec mon exemple de code. :-( –

0

Le classeur a simplement besoin des mêmes noms dans les propriétés de classe et la valeur du champ, l'appel de updatemodel place toutes les valeurs correspondantes dans le modèle.

Donc, vous devriez être capable de simplement créer un type de classe et appeler updatemodel ???