2010-01-17 5 views
1

est-il possible d'utiliser une sorte de Multibinders, comme ceci?ASP.NET MVC: liaison de plusieurs modèles

[Authorize] 
[AcceptVerbs("POST")] 
public ActionResult Edit([CustomBinder]MyObject obj) 
{ 
    ///Do sth. 
} 

Quand je également avoir configuré un classeur par défaut comme ceci:

protected void Application_Start() 
    { 
     log4net.Config.XmlConfigurator.Configure(); 
     RegisterRoutes(RouteTable.Routes); 

     ModelBinders.Binders.DefaultBinder = new Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder(); 
    } 

Ce que je veux est d'avoir les avantages du DataAnnotationsBinder (qui valide les données pour stringlength, regexps, etc.) et, en outre mon classeur personnalisé qui définit les valeurs de champ.

Je ne peux pas écrire seulement 1 liant pour cela, comme iam utilisant le EntitiyFramework et en combinaison avec les DataAnnotations il en résulte contstruct comme ceci:

[MetadataType(typeof(MyObjectMetaData))] 
    public partial class MyObject 
    { 
    } 


    public class MyObjectMetaData 
    { 
    [Required] 
    [StringLength(5)] 
    public object Storename { get; set; } 
    } 

Répondre

1

Vous pouvez essayer d'appeler le liant modèle par défaut dans votre classeur modèle personnalisé.

public class CustomBinder : IModelBinder { 
    public object BindModel(ControllerContext controllerContext, 
    ModelBindingContext bindingContext) { 
     MyObject o = (MyObject)ModelBinders.Binders 
      .DefaultBinder.BindModel(controllerContext, bindingContext); 
     //Your validation goes here. 
     return o; 
    } 
} 
1

Pourquoi ne venez-vous pas d'hériter de DataAnnotationsModelBinder?

public class MyBinder : DataAnnotationsModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     MyModel obj = (MyModel)base.BindModel(controllerContext, bindingContext); 
     //Do your operations 
     return obj; 
    } 
} 

ModelBinders.Binders[typeof(MyModel)] = new MyBinder();