ASP.NET MVC: привязка нескольких моделей - PullRequest
1 голос
/ 17 января 2010

возможно ли использовать какой-нибудь мультибиндер, как этот?

[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 (который проверяет данные на длину строки, регулярные выражения и т. Д.), А также мой пользовательский связыватель, который устанавливает значения полей.

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

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


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

Ответы [ 2 ]

1 голос
/ 17 января 2010

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

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

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;
    }
}
...