在《ASP.NET MVC下的四種驗證編程方式》 一文中我們介紹了ASP.NET MVC支持的四種服務端驗證的編程方式(“手工驗證”、“標注ValidationAttribute特性”、“讓數據類型實現 IValidatableObject或者IDataErrorInfo”),那么在ASP.NET MVC框架內部是如何提供針對這四種不同編程方式的支持的呢?接下來我們就來聊聊這背后的故事。
一、ModelValidator與ModelValidatorProvider
雖 然Model綁定的方式因被驗證數據類型的差異而有所不同,但是ASP.NET MVC總是使用一個名為ModelValidator的對象來對綁定的數據對象實施驗證。所有的ModelValidator類型均繼承自具有如下定義的 抽象類ModelValidator。它的GetClientValidationRules方法返回一個元素類型為 ModelClientValidationRule的集合,而ModelClientValidationRule是對客戶端驗證規則的封裝,我們會在 客戶端驗證部分對其進行詳細介紹。
3: //其他成員
4: public virtual IEnumerable<ModelClientValidationRule> GetClientValidationRules();
object container);
6:
7: public virtual bool IsRequired { get; }
2: {
3: public string MemberName { get; set; }
4: public string Message { get; set; }
2: {
4: public static readonly ValidationResult Success;
2: {
3: public abstract IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);
2: {
3: public static ModelValidatorProviderCollection Providers { get; }
5:
6: public class ModelValidatorProviderCollection : Collection<ModelValidatorProvider>
8: public ModelValidatorProviderCollection();
9: public ModelValidatorProviderCollection(IList<ModelValidatorProvider> list);
10: public IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);
2: {
4: public virtual IEnumerable<ModelValidator> GetValidators(ControllerContext context);
二、DataAnnotationsModelValidator
我們在《ASP.NET MVC下的四種驗證編程方式》 中介紹了三種不同的“自動化驗證”的編程方式,ASP.NET MVC在內部會采用不同的ModelValidator來對綁定的參數實施驗證。一個具體的ModelValidator通常有相應的 ModelValidatorProvider來提供,接下來的內容中將對ASP.NET MVC提供的原生的ModelValidator和對應的ModelValidatorProvider作詳細的介紹。
對于上面提到的這三種驗證編程方式,第一種(利用應用在數據類型或其數據成員上的ValidationAttribute特性來定義相應的驗證規 則)是最為常用的。基于ValidationAttribute特性這種聲明式驗證解決方案最終通過 DataAnnotationsModelValidator來完成。一個DataAnnotationsModelValidator對象實際上是對一 個ValidationAttribute特性的封裝,這可以從如下所示的定義看出來。
3: public DataAnnotationsModelValidator(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute);
4: public override IEnumerable<ModelClientValidationRule> GetClientValidationRules();
5:
object container);
7:
8: protected internal ValidationAttribute Attribute { get; }
9: protected internal string ErrorMessage { get; }
10: public override bool IsRequired { get; }
2: {
3: public ValidatableObjectAdapter(ModelMetadata metadata, ControllerContext context);
object container);
2: {
3: public DataErrorInfoClassModelValidator(ModelMetadata metadata, ControllerContext controllerContext);
object container);
6:
8: {
9: public DataErrorInfoPropertyModelValidator(ModelMetadata metadata, ControllerContext controllerContext);
object container);
1: public class DataErrorInfoModelValidatorProvider : ModelValidatorProvider
3: public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);
4: }
上一篇 ASP.NET MVC下的四種驗證編程方式
原文:http://www.cnblogs.com/artech/p/asp-net-mvc-4-validation.html
文章列表