2011-03-09 131 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