我在我的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