1. 程式人生 > >Model驗證

Model驗證

ann img header osi 得到 dict ada site eve

上節說了Asp.net MVC中Model的綁定,本節講解下Model綁定時的數據驗證。
技術分享圖片

數據結構

Model驗證中的錯誤信息怎樣存儲?怎樣傳遞給View?
ModelError類型每條錯誤信息,ModelErrorCollection錯誤提示的集合,ModelState為存儲錯誤驗證和數據源。其在參數綁定時將生成的ModelState(驗證信息和數據源)保存到了ControllerModelState屬性中(為ViewData的一部分,類型為ModelStateDictionary)。

 [Serializable]
    public class ModelState
    {
        private ModelErrorCollection _errors = new ModelErrorCollection();

        public ValueProviderResult Value { get; set; }

        public ModelErrorCollection Errors
        {
            get { return _errors; }
        }
    }

手工數據驗證

了解驗證數據傳遞到View的機制,可手工寫數據驗證方法.添加錯誤信息ModelState.AddModelError(key,value)

可驗類型

手工實現是麻煩的,可用通過定制數據,使數據可使用相應的驗證機制ModelValidator驗證。

  • 實現抽象類ValidationAttribute,將特性綁定到需要驗證的數據上
  • 實現接口IValidatableObject
  • 實現接口IDataErrorInfo

驗證驗證

對Model的驗證為ModelValidator,可通過實現該抽象類實現自定義的驗證策略。ModelValidator的抽象方法為Validate.

數據類型 驗證方法 validatorProvider
ValidationAttribute DataAnnotationsModelValidator DataAnnotationsModelValidatorProvider
IValidatableObject ValidatableObjectAdapter DataAnnotationsModelValidatorProvider
IDataErrorInfo DataErrorInfoModelValidator DataErrorInfoModelValidatorProvider

IValueProvider數據提供機制相似,這裏有ModelValidatorProvider

為對應ModelValidator提供器。可以通過ModelValidatorProviders註冊數據驗證機制。

CompositeModelValidator執行驗證的組織

CompositeModelValidatorModelValidator的內部類,通過靜態方法GetModelValidator獲得。
CompositeModelValidatorValidate會根據數據的元數據驗證其屬性Metadata.PropertiesAsArray。其中ModelMetadataGetValidators方法會得到其上的所有驗證,註意 ModelValidatorProvider有抽象方法public abstract IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);即可以通過ModelMetadata可獲得對應的驗證機制

public class ModelMetadata{
        public virtual IEnumerable<ModelValidator> GetValidators(ControllerContext context)
        {
            return ModelValidatorProviders.Providers.GetValidators(this, context);
        }
} 
   public static class ModelValidatorProviders
    {
        public static ModelValidatorProviderCollection Providers
        {
            get { return _providers; }
        }
    }

驗證策略

數據綁定時驗證,其實驗證註意驗證的為復雜類型。
DefaultModelBinder進行BindModel時驗證並將驗證信息保存到ModelState.
OnModelUpdated(controllerContext, newBindingContext);方法

Model驗證