엔터프라이즈 라이브러리 유효성 검사 블록을 가지고 놀고 있습니다. 나는 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}"; }
}
}
}