在MVC 3中使用Custom Collection Model Binder的问题

时间:2012-05-10 23:11:40

标签: c# asp.net-mvc-3 model-binding modelbinders

我在MVC中创建模型绑定器时遇到问题。

我定位的操作如下:

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

我创建了一个自定义模型绑定器,并使用以下代码注册它:

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

附加调试器后,我可以看到正在调用CollectionModelBinder's CreateModel方法。但是,当执行到达控制器的action方法时,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}};
    }
}

更新

这是DefaultModelBinder.的一个问题调用CreateModel之后,调用了另一个内部方法UpdateCollection,它有效地清除了由CreateModel.创建的集合。解决方案是推出我自己的IModelBinder.实现IModelBinder.BindModel上唯一缺少的modelType,参数很容易获得:

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

1 个答案:

答案 0 :(得分:1)

这是DefaultModelBinder.的一个问题调用CreateModel之后,调用了另一个内部方法UpdateCollection,它有效地清除了由CreateModel.创建的集合。解决方案是推出我自己的IModelBinder.实现IModelBinder.BindModel上唯一缺少的modelType,参数很容易获得:

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