我一直在研究一個使用xVal的服務器端驗證和數據註釋的應用程序。我們最近遇到了錯誤,其中驗證消息對於有多個驗證的字段而言是不可預測的,如果該字段爲空(例如,需要電子郵件地址,但無法驗證有效性),則驗證消息可能會失敗。如何確定不可預測的LINQ查詢結果的來源?
假設我需要只返回一個驗證錯誤,我添加了一個方法,我們的驗證亞軍,以實現這一目標(UPDATE:見編輯在底部的確切方法):
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);
}
我還設置了一個簡單的測試方法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',無論是顯式的還是隱式的。 – 2010-02-15 14:30:12
對不起!我粘貼了適當的方法。 – 2010-02-15 15:35:36