2009-01-18 11 views
6

J'ai un formulaire qui doit remplir 2 modèles. Normalement, j'utiliser un ModelBinderAttribute sur les formes poster action, à savoirASP.NET MVC - Plusieurs modèles dans un classeur et un classeur

[Authorize] 
    [AcceptVerbs("POST")] 
    public ActionResult Add([GigBinderAttribute]Gig gig, FormCollection formCollection) 
    { 
     ///Do stuff 
    } 

Dans ma forme, les champs sont le même nom que les propriétés des modèles ...

Cependant, dans ce cas, j'ai 2 modèles différents qui ont besoin peuplement.

Comment faire? Des idées? C'est possible?

Répondre

9

En fait ... la meilleure façon est de le faire:

public ActionResult Add([GigBinderAttribute]Gig gig, [FileModelBinderAttribute]File file) { 

}

Vous pouvez utiliser plusieurs attributs!

0

La méthode UpdateModel ou TryUpdateModel peut être utilisée pour cela. Vous pouvez passer à travers le modèle, le modèle que vous souhaitez lier, le préfixe des éléments que vous souhaitez lier à ce modèle et le formulaire. Par exemple, si votre modèle d'objet a des variables sous forme de « Item.Value » alors votre mise à jour méthode de modèle serait:

UpdateMode(modelObject, stringPrefix, formCollection); 

Si vous utilisez le cadre de l'entité, il est intéressant de souligner que la méthode UpdateModel ne Toujours travailler sous certaines conditions. Cela fonctionne particulièrement bien avec les POCOs.

+0

Est-il possible de le faire automatiquement en utilisant des attributs? – iasksillyquestions

8

Dans les cas comme celui-ci, je tends à faire un seul type de modèle pour envelopper les différents modèles impliqués:

class AddModel 
{ 
    public Gig GigModel {get; set;} 
    public OtherType OtherModel {get; set;} 
} 

... et lier que.

+1

Vous devez juste vous assurer que vos noms de champ de formulaire ont le préfixe du nom de la propriété, par exemple Gig.Name, Gig.Date et OtherModel.SomeProperty – superlogical

+2

A partir de MVC 2, si vous utilisez EditorFor (model => model. Gig), le préfixe fonctionne pour vous. Vous pouvez cependant consommer tous les sous-modèles en tant que paramètres séparés, ce qui facilite la décomposition des attributs (par exemple, 'ActionResult SomePostAction ([Bind (Include = {" list "," of "," bindable "," fields "}, Prefix = "Gig"] GigModel concert, [Bind (...)] OtherModel other) ') Ensuite, il suffit de construire un modèle composite à partir de là:' var m = new AddModel {Gig = concert, OtherType = autre } '. – patridge

Questions connexes