ASP.NET MVC アプリケーションでxValを使用していますが、これは一般的に優れています。Steve Sanderson のブログ投稿に従って、属性付きオブジェクトのサーバー側検証を行う DataAnnotationsValidationRunner を作成しました。これは、単純なクラスに最適です。例: 人:
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; }
}
ただし、この人に Address プロパティを追加し、Address クラスを 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; }
}
1 つの問題は、DataAnnotationValidationRunner が複雑な子プロパティをたどらないことです。また、これらのエラーがエラー コレクションに追加された場合でも、モデルの状態に追加されたときに正しくプレフィックスを付ける必要があります。例えば。Person エラーは次のように追加されます。
catch (RulesException ex)
{
ex.AddModelStateErrors(ModelState, "person");
}
アドレス ルールの例外には、「person.address」というプレフィックスを付ける必要があると思います。xVal を使用して子オブジェクトの検証を処理するサポートされている方法はありますか?それとも、フラット化されたデータ転送オブジェクトを作成することが唯一の解決策でしょうか?