Asp.net mvc 3 - Custom Model Binding

I have a model like this

public string Name { get; set; } public IEnumerable<int> ProjectMembersId { get; set; } 

The property name must be bound using the standard binding code.

But the ProjectMembersId property must be related to using my custom code.

So, I got the class from DefaultModelBinder and redefined the SetProperty method.

 protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value) { if (propertyDescriptor.Name == "ProjectMembersId") { var list = new List<int>(5); var form = controllerContext.HttpContext.Request.Form; var names = form.AllKeys.Where(x => x.StartsWith("dhxGridObj")); foreach (var name in names) { int i; if (int.TryParse(form.Get(name), out i)) { list.Add(i); } } value = list; } base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value); } 

The bad problem is that the SetProperty method is not called because the value provider does not contain an element called ProjectMembersId.

Maybe I'm overriding the wrong part of defaultModelBinder. So what would be the best way?

+4
source share
1 answer

Try using the BindProperty method:

  public class CustomModelBinder : DefaultModelBinder { protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) { if (propertyDescriptor.Name == "ProjectMembersId") { var list = new List<int>(5); var form = controllerContext.HttpContext.Request.Form; var names = form.AllKeys.Where(x => x.StartsWith("dhxGridObj")); foreach (var name in names) { int i; if (int.TryParse(form.Get(name), out i)) { list.Add(i); } } SetProperty(controllerContext, bindingContext, propertyDescriptor, list); } else { base.BindProperty(controllerContext, bindingContext, propertyDescriptor); } } } 
+8
source

Source: https://habr.com/ru/post/1343008/


All Articles