저는 데이터 주석이있는 xVal의 서버 측 유효성 검사를 사용하는 응용 프로그램에서 작업했습니다. 최근 필드가 비어있는 경우 실패 할 수있는 여러 유효성 검사가있는 입력란 (예 : 이메일 주소가 필요하지만 유효성 검사에도 실패한)에 대해 유효성 확인 메시지를 예측할 수없는 오류가 발생했습니다.예측할 수없는 LINQ 쿼리 결과의 원본을 어떻게 결정합니까?
public static IEnumerable<ErrorInfo> GetFirstErrors<T>(object instance) where T : ValidationAttribute
{
return from prop in TypeDescriptor.GetProperties(instance).Cast<PropertyDescriptor>()
from attribute in prop.Attributes.OfType<T>().Take(1)
where !attribute.IsValid(prop.GetValue(instance))
select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty), instance);
}
:
난 그냥 첫 번째 유효성 검사 오류를 반환 할 필요가 있다고 가정하면, 그 목표 (: 정확한 방법의 하단에있는 편집을 참조 UPDATE)를 달성하기 위해 우리의 검증 주자에 메서드를 추가
또한 NUnit과에 확인하는 간단한 테스트 방법을 설정 :
private class FirstErrorValidationTest
{
[RequiredValueValidator(ErrorMessage = "This field is required"), StringLength(50)]
public string FirstName { get; set; }
[RequiredValueValidator(ErrorMessage = "This field is required"), StringLength(50)]
public string LastName { get; set; }
[RequiredValueValidator(ErrorMessage = "This field is required"), EmailAddressValidator, StringLength(50)]
public string EmailAddress { get; set; }
}
[Test]
public void Assert_GetFirstErrors_Gets_First_Listed_Validation_Attribute_Error_Messages()
{
FirstErrorValidationTest test = new FirstErrorValidationTest()
{
FirstName = "",
LastName = "",
EmailAddress = ""
};
var errors = DataAnnotationsValidationRunner.GetFirstErrors(test);
Assert.AreEqual(3, errors.Count());
foreach (var error in errors)
Assert.IsTrue(error.ErrorMessage.Contains("required"));
}
문제는이 테스트의 출력은 매우 예측할 수없는 것입니다. 때로는 통과하고, 때로는 오류 중 하나 또는 두 개를 반환하고 때로는 전혀 반환하지 않습니다. LINQ 쿼리, 테스트 또는 둘 다에서 문제가 발생합니까?
편집 : 약간 다른 방법으로 붙여 넣기에 좋은 점; 여기에 실제로 명중 하나는 다음과 같습니다
public static IEnumerable<ErrorInfo> GetFirstErrors(object instance)
{
return from prop in TypeDescriptor.GetProperties(instance).Cast<PropertyDescriptor>()
from attribute in prop.Attributes.OfType<ValidationAttribute>().Take(1)
where !attribute.IsValid(prop.GetValue(instance))
select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty), instance);
}
어떻게 컴파일합니까? 'GetFirstErrors'는 명시 적으로 또는 암시 적으로 지정하지 않는 타입 매개 변수 'T'를 요구합니다. –
죄송합니다! 나는 적절한 방법으로 붙여 넣었다. –