2010-06-18 4 views
3

포함 된 코드의 양을 사과드립니다. 나는 그것을 최소한으로 유지하려고 노력했다.MVC 2의 사용자 정의 모델 바인더가있는 사용자 정의 유효성 검사 속성

내 모델 및 맞춤 모델 바인더에 맞춤 검사기 특성을 갖기 위해 노력하고 있습니다. 애트리뷰트와 바인더는 별개로 작동하지만 둘 다 가지고있는 경우 유효성 검사 속성은 더 이상 작동하지 않습니다.

내 코드는 가독성을 위해 잘라 냈습니다. global.asax에서 코드를 생략하면 사용자 지정 유효성 검사가 실행되지만 사용자 지정 바인더를 사용할 수있는 경우에는 발생하지 않습니다.

유효성 검사 속성;

public class IsPhoneNumberAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     //do some checking on 'value' here 
     return true; 
    } 
} 

내 모델에서 애트리뷰트 사용.

[Required(ErrorMessage = "Please provide a contact number")] 
    [IsPhoneNumberAttribute(ErrorMessage = "Not a valid phone number")] 
    public string Phone { get; set; } 

맞춤 모델 바인더;

public class CustomContactUsBinder : DefaultModelBinder 
{ 
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     ContactFormViewModel contactFormViewModel = bindingContext.Model as ContactFormViewModel; 

     if (!String.IsNullOrEmpty(contactFormViewModel.Phone)) 
      if (contactFormViewModel.Phone.Length > 10) 
       bindingContext.ModelState.AddModelError("Phone", "Phone is too long."); 
    } 
} 

Global asax;

System.Web.Mvc.ModelBinders.Binders[typeof(ContactFormViewModel)] = 
    new CustomContactUsBinder(); 
+0

기술적으로, 당신은 정말 사용자 정의 모델 바인더와 결합 어떤 모델을하고 있지 않습니다. 이것은 단지 모델 바인더를 유효성 검사에만 사용하는 것입니다 (모델 바인더가 아닌). 전화 번호 길이에 대해 별도의 유효성 검사가 필요한 경우이 속성도 사용할 수 있습니다. –

+0

@Derek, 나는 당신이 여기있는 사람들에게 가능한 예를 들어 이것을 사용하고 있음에 동의합니다. 나는 거기에 프로퍼티 바인딩 코드를 가지고 있는데, 여기서 제시 한 것은 스 니펫이다. – griegs

답변

5

당신이 base 메소드를 호출하고 있는지 확인하십시오 :

protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    ContactFormViewModel contactFormViewModel = bindingContext.Model as ContactFormViewModel; 

    if (!String.IsNullOrEmpty(contactFormViewModel.Phone)) 
     if (contactFormViewModel.Phone.Length > 10) 
      bindingContext.ModelState.AddModelError("Phone", "Phone is too long."); 

    base.OnModelUpdated(controllerContext, bindingContext); 
} 
+0

AAAahhhh! 방금 SVN을 확인했습니다. 오늘 아침에 바보 같은 이유로 그것을 제거하고 잊어 버렸습니다! @ 대린 감사합니다. – griegs