2010-02-11 1 views
9

Mvc 응용 프로그램에서 사용자 정의 모델 바인더를 만들고 문자열을 열거 형 값으로 구문 분석하고이를 모델 속성에 할당하려고합니다. BindProperty 메서드를 재정의하는 방법을 찾았지만 SetProperty 메서드가있는 것으로 나타났습니다.IModelBinder의 BindProperty와 SetProperty의 차이점

protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) 
    { 
     switch (propertyDescriptor.Name) 
     { 
      case "EnumProperty": 
       BindEnumProperty(controllerContext, bindingContext); 
       break; 
     } 

     base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
    } 

    private static void BindEnumProperty(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var formValue = controllerContext.HttpContext.Request.Form["formValue"]; 

     if (String.IsNullOrEmpty(formValue)) 
     { 
      throw new ArgumentException(); 
     } 

     var model = (MyModel)bindingContext.Model; 
     model.EnumProperty = (EnumType)Enum.Parse(typeof(EnumType), formValue); 
    } 

나는 둘 사이의 차이점과 내가 권장하는 방식으로이 작업을 수행하는지 여부를 잘 모릅니다.

답변

6

우선 BindProperty는 IModelBinder의 일부는 아니지만 DefaultModelBinder의 보호 된 메서드입니다. DefaultModelBinder를 하위 클래스로 분류하는 경우에만 액세스 할 수 있습니다.

다음 사항은 귀하의 질문에 대답해야합니다

  • BindProperty 그것이 의 PropertyDescriptor 인수의 PropertyType에서 얻는 IModelBinder 인터페이스를 사용합니다. 이 을 사용하면 사용자 정의 속성을 메타 데이터 속성에 삽입 할 수 있습니다.
  • BindProperty 제대로 유효성 검사를 처리합니다. 또한 새 값인 이 유효한 경우에만 SetProperty 메서드를 호출합니다.

따라서 주석 속성을 사용하여 올바른 유효성 검사를 원할 경우 반드시 BindProperty를 호출해야합니다. SetProperty를 호출하면 내장 된 모든 유효성 검사 메커니즘을 무시할 수 있습니다.

인텔리 센스는 제한된 정보만을 제공하기 때문에 소스 코드 DefaultModelBinder을 확인해야합니다.

+0

소스에서는 무효, http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/DefaultModelBinder.cs – Rob

+0

@ 롭 귀하의 URL도 –

+0

@Kilanny 무효에 지금? 그것은 여전히 ​​나를 위해 일하는 것 같습니다. – Rob

0

SetProperty는 마지막 값으로 설정하기 위해 실제 값을 사용한다고 생각합니다.