2011-03-14 5 views
0

엔터프라이즈 라이브러리 유효성 검사 블록을 가지고 놀고 있습니다. 나는 MVC 프로젝트에서 사용하고있는 Linq To Entities edmx 파일의 클래스를 가지고있다. Nullable DateTime이 항상 DateTime보다 늦지 않도록하고 싶습니다. 메타 데이터 클래스의 속성을 사용하여 기본 룰 세트를 작성하고 있습니다. PropertyComparisonValidator를 사용하여 유효성을 검사하려고 시도 할 때 예외가 발생합니다.Nullable 용 엔터프라이즈 라이브러리 유효성 검사 블록 <DateTime>

유효성 검사 유형이 PropertyComparisonValidatorAttribute 인 경우 값의 유효성을 검사 할 수 없습니다.

저는 이론적으로 Nullable 유형을 구조체와 비교할 수 없다는 이론을 세웠으므로이 문제를 해결하기 위해 custom 클래스를 구체적으로 작성했습니다. 여전히 예외가 발생합니다.

NullableDateComparisonValidatorAttribute 형식의 유효성 검사 특성을 사용하여 값의 유효성을 검사 할 수 없습니다.

다음으로 엔터프라이즈 라이브러리에서 자체 유효성 검사를 시도했으나 유효성을 검사 할 때 실행하지 못했습니다. 내가 알아낼 때까지 나는 일시적인 정지 상태에있다. 너무 못생긴 해결책 \ 해결 방법을 제안하십시오.

using System; 
using System.Reflection; 
using Microsoft.Practices.EnterpriseLibrary.Validation; 
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators; 

namespace IdahoUtility 
{ 
    public class NullableComparisonValidator<T> : Validator<Nullable<T>> 
     where T: struct, IComparable 
    { 
     protected string propertyToCompare { get; set; } 
     protected ComparisonOperator comparisionOperator { get; set; } 
     protected T TargetProperty(object currentTarget) 
     { 
      if (null == currentTarget) 
      { 
       throw new ArgumentNullException("currentTarget"); 
      } 

      Type t = currentTarget.GetType(); 
      PropertyInfo pInfo = t.GetProperty(propertyToCompare); 
      object oValue = pInfo.GetValue(currentTarget, null); 

      if (oValue.GetType() != typeof(T)) 
      { 
       throw new InvalidOperationException(string.Format("Property compared must be a {0}!",typeof(T))); 
      } 

      return (T)oValue; 
     } 
     public NullableComparisonValidator(string PropertyToCompare, ComparisonOperator cmpOp) 
      :base(null,null) 
     { 
      if (string.IsNullOrWhiteSpace(PropertyToCompare)) 
      { 
       throw new ArgumentException("PropertyToCompare is Invalid!", "PropertyToCompare"); 
      } 
      propertyToCompare = PropertyToCompare; 
      comparisionOperator = cmpOp; 
     } 
     protected override void DoValidate(Nullable<T> objectToValidate, object currentTarget, string key, ValidationResults validationResults) 
     { 
      // ignore nulls 
      if (null == objectToValidate) 
      { 
       return; 
      } 

      switch (comparisionOperator) 
      { 
       case ComparisonOperator.Equal: 
        DoValidateEqual(objectToValidate, currentTarget, key, validationResults); 
        break; 
       case ComparisonOperator.GreaterThan: 
        DoValidateGreaterThan(objectToValidate, currentTarget, key, validationResults); 
        break; 
       case ComparisonOperator.GreaterThanEqual: 
        DoValidateGreaterThanEqual(objectToValidate, currentTarget, key, validationResults); 
        break; 
       case ComparisonOperator.LessThan: 
        DoValidateLessThan(objectToValidate, currentTarget, key, validationResults); 
        break; 
       case ComparisonOperator.LessThanEqual: 
        DoValidateLessThanEqual(objectToValidate, currentTarget, key, validationResults); 
        break; 
       case ComparisonOperator.NotEqual: 
        DoValidateNotEqual(objectToValidate, currentTarget, key, validationResults); 
        break;    
      } 
     } 

     private void DoValidateLessThanEqual(Nullable<T> objectToValidate, object currentTarget, string key, ValidationResults validationResults) 
     { 
      if (objectToValidate.Value.CompareTo(TargetProperty(currentTarget)) > 0) 
      { 
       LogValidationResult(validationResults, string.Format("Should be less than or equal to {0}!", propertyToCompare), currentTarget, key); 
      } 
     } 

     private void DoValidateLessThan(Nullable<T> objectToValidate, object currentTarget, string key, ValidationResults validationResults) 
     { 
      if (objectToValidate.Value.CompareTo(TargetProperty(currentTarget)) >= 0) 
      { 
       LogValidationResult(validationResults, string.Format("Should be less than {0}!", propertyToCompare), currentTarget, key); 
      } 
     } 

     private void DoValidateGreaterThanEqual(Nullable<T> objectToValidate, object currentTarget, string key, ValidationResults validationResults) 
     { 
      if (objectToValidate.Value.CompareTo(TargetProperty(currentTarget)) < 0) 
      { 
       LogValidationResult(validationResults, string.Format("Should be greater than or equal {0}!", propertyToCompare), currentTarget, key); 
      } 
     } 

     private void DoValidateGreaterThan(Nullable<T> objectToValidate, object currentTarget, string key, ValidationResults validationResults) 
     { 
      if (objectToValidate.Value.CompareTo(TargetProperty(currentTarget)) <= 0) 
      { 
       LogValidationResult(validationResults, string.Format("Should be greater than {0}!", propertyToCompare), currentTarget, key); 
      } 
     } 

     private void DoValidateEqual(Nullable<T> objectToValidate, object currentTarget, string key, ValidationResults validationResults) 
     { 
      if (objectToValidate.Value.CompareTo(TargetProperty(currentTarget)) != 0) 
      { 
       LogValidationResult(validationResults, string.Format("Should be equal to {0}!", propertyToCompare), currentTarget, key); 
      } 
     } 

     private void DoValidateNotEqual(Nullable<T> objectToValidate, object currentTarget, string key, ValidationResults validationResults) 
     { 
      if (objectToValidate.Value.CompareTo(TargetProperty(currentTarget)) == 0) 
      { 
       LogValidationResult(validationResults, string.Format("Should not be equal to {0}!", propertyToCompare), currentTarget, key); 
      } 
     } 

     protected override string DefaultMessageTemplate 
     { 
      get { return "{0}"; } 
     } 
    } 
} 

답변

0

이 문제는 null 허용 유형과 관련이 없습니다. 나는 검증을 완전히 다시 마무리했다. 메타 데이터 클래스를 특성으로 제거하고 엔터프라이즈 라이브러리 도구를 사용하여 유효성 검사를 구성으로 이동했습니다. 마지막으로 속성 비교 검사기를 사용하여 종료 날짜가 시작 날짜를 따라 갔는지 확인할 수있었습니다. 마지막 걸림돌은 기본 규칙 집합을 사용할 수 없다는 것이 었습니다. ASP.NET MVC 웹 사이트에서 이것을 사용하고 있으며 엔터프라이즈 라이브러리를 사용하여 클라이언트 측 유효성 검사 작업을 수행 할 수있었습니다. 나는 원래 설정이 효과가 없었던 이유가 내게 불분명하더라도 실제로 모든 것을 매우 기쁘게 생각합니다.

관련 문제