2011-03-09 19 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); 
} 

バッド値プロバイダにProjectMembersIdという項目が含まれていないため、SetPropertyメソッドが呼び出されないという問題があります。

おそらく、私はdefaultModelBinderの間違った部分をオーバーライドしています。それでは、何が最善の方法でしょうか?

+1

は、あなたがこのモデルのカスタムmodelbinderを登録したことがありますか? – frennky

+0

もちろん、モデルバインダーは単にSetProperty funcと呼ばれ、スキップされます。 – user256034

答えて

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