2012-05-10 159 views
1

我在创建MVC模型绑定器时遇到问题。MVC中的自定义集合模型绑定器问题3

是我针对看似行动:

public ActionResult GetAccounts (ICollection<Account> accounts){} 

我创建了一个自定义模型粘合剂和用下面的代码注册它:

ModelBinders.Binders.Add(typeof(ICollection<Account>),new CollectionModelBinder()); 

附带一个调试器,我可以看到CollectionModelBinder's CreateModel方法正在被调用。但是,当执行到达控制器的操作方法时,accounts参数为null。

这是什么问题?

我的模型绑定的样子:

public class CollectionModelBinder : DefaultModelBinder 
{ 
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) 
    { 
     return new List<Account> { 
      new Account {Id = 1}, 
      new Account {Id = 2}, 
      new Account {Id = 3}}; 
    } 
} 

UPDATE:

这与DefaultModelBinder.CreateModel后叫,另一个内部方法的问题,UpdateCollection被调用,从而有效地清零了集合这是由CreateModel.创建的解决方案是滚动我自己的实现IModelBinder.IModelBinder.BindModel上缺少的唯一参数是modelType,这很容易Ø获得:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    var type = bindingContext.ModelType; 
    //... 
} 

回答

1

这与DefaultModelBinder.CreateModel被称为后一个问题,另一个内部方法,UpdateCollection被调用,从而有效地清零了,是由CreateModel.创建的集合的解决方案是推出自己的执行IModelBinder.IModelBinder.BindModel上唯一缺少的参数是modelType,这很容易得到:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    var type = bindingContext.ModelType; 
    //... 
}