2011-03-09 130 views
4

我有这样Asp.net MVC 3 - 自定义模型绑定

public string Name { get; set; } 

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

属性名的模型应该使用非标准绑定代码绑定。

但属性ProjectMembersId应该使用我的自定义代码绑定。

所以我从DefaultModelBinder派生了一个类,并重写了SetProperty方法。

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

问题是SetProperty方法未被调用,因为值提供程序不包含名为ProjectMembersId的项。

也许我重写了defaultModelBinder的错误部分。那么最好的办法是什么?

+1

你有没有注册您的自定义ModelBinder的这种模式? – frennky 2011-03-09 15:01:30

+0

当然,只需调用模型绑定器即可跳过SetProperty函数。 – user256034 2011-03-09 18:33:28

回答

8

BindProperty方法试试:

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); 
      } 
     } 
    } 
+0

SetProperty和BindProperty有什么区别? – user256034 2011-03-10 12:04:45