Issue With Custom Collection Model Binder in MVC 3
-
07-06-2021 - |
문제
I'm having an issue creating a model binder in MVC.
The action that I'm targeting looks like:
public ActionResult GetAccounts (ICollection<Account> accounts ){}
I created a custom model binder and registered it with the following code:
ModelBinders.Binders.Add(typeof(ICollection<Account>),new CollectionModelBinder());
With a debugger attached, I can see that the CollectionModelBinder's CreateModel
method is being called. However, when execution reaches the action method of the controller, the accounts parameter is null.
What's the issue?
My model binder looks like:
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:
This was a problem with DefaultModelBinder.
After CreateModel
was called, another internal method, UpdateCollection
was called, which effectively nulled out the collection that was created by CreateModel.
The solution was to roll my own implementation of IModelBinder.
The only argument that's missing on IModelBinder.BindModel
is the modelType,
which is easy to get:
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var type = bindingContext.ModelType;
//...
}
해결책
This was a problem with DefaultModelBinder.
After CreateModel
was called, another internal method, UpdateCollection
was called, which effectively nulled out the collection that was created by CreateModel.
The solution was to roll my own implementation of IModelBinder.
The only argument that's missing on IModelBinder.BindModel
is the modelType,
which is easy to get:
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var type = bindingContext.ModelType;
//...
}