0

내가 모듈 수준 유효성 검사기를 사용하고어떻게 모듈 수준 검사기는 속성 수준 검사기 후에 만 ​​평가됩니까? 과 같이, 내보기 모델에 'PropertiesMustMatch':

[PropertiesMustMatch("Password", "PasswordConfirm")] 
public class HomeIndex 
{ 
    [Required] 
    public string Name { get; set; } 

    public string Password { get; set; } 

    public string PasswordConfirm { get; set; } 
} 

내가 이름없이 양식을 제출하는 경우에 가득한 것을 알았어 야의의 ValidationSummary() 헬퍼 만 반환 다음과 같은 오류가 :

  • 'Password' and 'PasswordConfirm' do not match.
: 나는 이름을 입력하면

  • The Name field is required.

그러나, 의 ValidationSummary()는 PropertiesMustMatch의 오류를 반환합니다

그래서 속성 수준 검사기가 먼저 평가되고 모델 수준 검사기처럼 보입니다.

그들은 모두 한 번에 확인한다면 내가 많이 선호하고의 ValidationSummary가 반환

:

  • The Name field is required.
  • 'Password' and 'PasswordConfirm' do not match.

나는이 문제를 해결하기 위해 할 수있는 어떤 아이디어?

MVC 2 소스 코드를 연구하여 왜 이런 일이 발생하는지 확인하려고합니다.

답변

0

나는이 문제의 원인을 발견했지만, 내 "솔루션"은 아마 유효성 검사기의 정상적인 처리를 깨뜨릴 것입니다. 주의해서 사용하십시오.

은 내가 DefaultModelBinder의 OnModelUpdated 기능에 조건부 return 문을 발견 :

protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    IDataErrorInfo errorProvider = bindingContext.Model as IDataErrorInfo; 
    if (errorProvider != null) 
    { 
     string errorText = errorProvider.Error; 
     if (!String.IsNullOrEmpty(errorText)) 
     { 
      bindingContext.ModelState.AddModelError(bindingContext.ModelName, errorText); 
     } 
    } 

    // BEGIN CONDITION 
    if (!IsModelValid(bindingContext)) 
    { 
     return; 
    } 
    // END CONDITION 

    foreach (ModelValidator validator in bindingContext.ModelMetadata.GetValidators(controllerContext)) 
    { 
     foreach (ModelValidationResult validationResult in validator.Validate(null)) 
     { 
      bindingContext.ModelState.AddModelError(CreateSubPropertyName(bindingContext.ModelName, validationResult.MemberName), validationResult.Message); 
     } 
    } 
} 

나는 (이 그럴 수도) MVC 팀이 모델 검증이 시점에서 제외 될 예정 것으로 보인다이 코드를 이해한다면 .

public class CustomModelBinder : DefaultModelBinder 
{ 
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     base.OnModelUpdated(controllerContext, bindingContext); 

     foreach (ModelValidator validator in bindingContext.ModelMetadata.GetValidators(controllerContext)) 
     { 
      foreach (ModelValidationResult validationResult in validator.Validate(null)) 
      { 
       bindingContext.ModelState.AddModelError(CreateSubPropertyName(bindingContext.ModelName, validationResult.MemberName), validationResult.Message); 
      } 
     } 
    } 
} 

이 문제를 해결하기 위해 보인다

나는이 조건에 의해 피할 것 코드를 다시 실행하는 내 자신의 사용자 정의 ModelBinder를가했습니다.

+0

제가 예상했듯이이 클래스를 상속하면 문제가 발생합니다. 기본적으로 [필수]를 제외한 모든 유효성 검사기를 건너 뜁니다. :( – Jonathan

+0

위의 문제가 해결되었습니다. 'base.OnModelUpdated'를 호출해야하는 기묘한 이유 때문에 평소와 같이 작동합니다. – Jonathan