2011-03-09 11 views
4

바인딩 사용자 정의 모델 나는이Asp.net MVC 3-

public string Name { get; set; } 

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

속성 이름과 같은 모델은 코드를 바인딩의 standart를 사용하여 바인딩해야합니다.

그러나 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

물론 modelbinder는 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