2009-01-18 35 views
6

Tengo un formulario que necesita llenar 2 modelos. Normalmente utilizo un ModelBinderAttribute en los formularios de publicar la acción es decirASP.NET MVC - Múltiples modelos en carpetas de formularios y modelos

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

En mi forma, los campos se denominan igual que las propiedades modelos ...

Sin embargo, en este caso tengo 2 modelos diferentes que necesitan poblando

¿Cómo puedo hacer esto? ¿Algunas ideas? ¿Es posible?

Respuesta

9

En realidad ... es la mejor manera de hacer esto:

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

}

puede utilizar varios atributos!

0

El método UpdateModel o TryUpdateModel se puede usar para hacer esto. Puede pasar por el modelo, el modelo que desea vincular, el prefijo de los elementos que desea vincular a ese modelo y el formulario. Por ejemplo, si su modelo de artículo tiene variables de formulario de "Item.Value", entonces su método de actualización del modelo sería:

UpdateMode(modelObject, stringPrefix, formCollection); 

Si está utilizando el marco de la entidad, vale la pena señalar que el método no hace UpdateModel siempre trabaje bajo algunas condiciones. Sin embargo, funciona particularmente bien con POCO.

+0

¿Es posible hacer esto automáticamente mediante el uso de atributos? – iasksillyquestions

8

En casos como este, que tienden a hacer un solo tipo de modelo para envolver los distintos modelos involucrados:

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

... y se unen eso.

+1

Solo tiene que asegurarse de que los nombres de los campos de sus formularios son el prefijo con el nombre de la propiedad, por ejemplo Gig.Name, Gig.Date y OtherModel.SomeProperty – superlogical

+2

A partir de MVC 2, si usa EditorFor (modelo => modelo. Gig), hace que el prefijo funcione para usted. Sin embargo, puede seguir consumiendo todos los submodelos como parámetros separados, permitiendo un desglose más fácil de los atributos (por ejemplo, 'ActionResult SomePostAction ([Bind (Include = {" list "," of "," bindable "," fields "}, Prefix = "Gig"] GigModel gig, [Bind (...)] OtherModel other) '). Luego solo necesitas construir un modelo compuesto desde allí:' var m = new AddModel {Gig = gig, OtherType = other } ' – patridge

Cuestiones relacionadas