2010-01-17 1 views
1

можно ли использовать какие-то мультииндиляторы, например?ASP.NET MVC: множественная привязка к модели

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

Когда я ТАКЖЕ настроил связующий по умолчанию, как это:

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

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

Что я хочу, чтобы иметь преимущества DataAnnotationsBinder (который проверяет данные для StringLength, регулярных выражений, и т.д.) и дополнительно мое настраиваемое связующее, которое задает значения полей.

Я не могу написать только один связующий для этого, как IAM с использованием EntitiyFramework и в сочетании с DataAnnotations это приводит к contstruct так:

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


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

ответ

1

Вы можете попробовать позвонить модель связующего по умолчанию в обычная модель.

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

Почему бы вам просто не наследовать от 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();