我在我的ASP.NET MVC應用程序中使用了xVal,這是非常棒的。在Steve Sanderson's blog post之後,我創建了一個DataAnnotationsValidationRunner來對屬性對象進行服務器端驗證。這對於一個簡單的課程非常有用。例如聯繫人:xVal如何驗證複雜類型的子屬性?
public static class DataAnnotationsValidationRunner
{
public static IEnumerable<ErrorInfo> GetErrors(object o)
{
return from prop in TypeDescriptor.GetProperties(o).Cast<PropertyDescriptor>()
from attribute in prop.Attributes.OfType<ValidationAttribute>()
where !attribute.IsValid(prop.GetValue(o))
select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty), o);
}
}
public class Person
{
[Required(ErrorMessage="Please enter your first name")]
public string FirstName { get; set; }
[Required(ErrorMessage = "Please enter your last name")]
public string LastName { get; set; }
}
不過,如果我添加一個地址屬性給這個人,並標註地址類DataAnnotation屬性,他們不會進行驗證。例如
public class Person
{
[Required(ErrorMessage="Please enter your first name")]
public string FirstName { get; set; }
[Required(ErrorMessage = "Please enter your last name")]
public string LastName { get; set; }
public Address Address { get; set; }
}
public class Address
{
[Required(ErrorMessage="Please enter a street address")]
public string Street { get; set; }
public string StreetLine2 { get; set; }
[Required(ErrorMessage = "Please enter your city")]
public string City { get; set; }
[Required(ErrorMessage = "Please enter your state")]
public string State { get; set; }
[Required(ErrorMessage = "Please enter your zip code")]
public string Zip { get; set; }
public string Country { get; set; }
}
一個問題是,DataAnnotationValidationRunner並未沿着複雜的子屬性行走。此外,如果將這些錯誤添加到錯誤集合中,則在添加到模型狀態時仍然需要正確加前綴。例如。該人錯誤添加這樣的:
catch (RulesException ex)
{
ex.AddModelStateErrors(ModelState, "person");
}
我想地址規則的例外是需要用「person.address」前綴。是否有支持使用xVal處理子對象驗證的方法,或者創建平面數據傳輸對象是唯一的解決方案?
第二個答案確實起作用,但如果父對象上有多個屬性都關聯了相同的子類型,但具有不同的屬性,則會失敗。即。 用戶 帳單地址 ShippingAddress 看起來好像您可以調整xval.jquery驗證實用程序來解決此問題。 – 2010-02-21 17:59:55