ASP.NET MVC Model驗證(五)

ASP.NET MVC Model驗證()

前言

上篇主要講解ModelValidatorProvider 和ModelValidator兩種類型的自定義實現, 然而在MVC框架中還給咱們提供了其它方式來進行Model驗證,也就是本篇的主題,使用框架提供給咱們的一系列的特性類型來進行Model驗證,固然也是能夠自定義的,在下面的演示示例中,我會使用咱們本身自定義的特性類型(繼承自ValidationAttribute類型)到自定義Model綁定器中來模擬一下實現。框架

 

Model驗證

  • Model驗證簡單運用示例
  • ModelValidator使用生成過程
  • 自定義實現DefaultModelBinder進行驗證
  • 自定義ModelValidatorProvider 和ModelValidator 
  • ValidationAttribute特性類使用
  • 自定義ValidationAttribute特性類的示例實現

 

ValidationAttribute特性類使用

咱們首先看一下ValidationAttribute類型的定義,示例代碼1-1。ide

代碼1-1ui

    public abstract class ValidationAttribute : Attribute
    {
        protected ValidationAttribute();
        protected ValidationAttribute(Func<string> errorMessageAccessor);
        protected ValidationAttribute(string errorMessage);

        // 摘要:
        //     獲取或設置一條在驗證失敗的狀況下與驗證控件關聯的錯誤消息。
        //
        // 返回結果:
        //     與驗證控件關聯的錯誤消息。
        public string ErrorMessage { get; set; }
        public string ErrorMessageResourceName { get; set; }
        public Type ErrorMessageResourceType { get; set; }
        protected string ErrorMessageString { get; }
        public virtual string FormatErrorMessage(string name);
        public ValidationResult GetValidationResult(object value, ValidationContext validationContext);
        //
        // 摘要:
        //     肯定對象的指定值是否有效。
        //
        // 參數:
        //   value:
        //     要驗證的對象的值。
        //
        // 返回結果:
        //     若是指定的值有效,則爲 true;不然,爲 false。
        public virtual bool IsValid(object value);
        protected virtual ValidationResult IsValid(object value, ValidationContext validationContext);
        public void Validate(object value, string name);
        public void Validate(object value, ValidationContext validationContext);
    }

ValidationAttribute類型就是下面示例中全部應用在Model屬性上特性類型的基類,在上面的ValidationAttribute類型中ErrorMessage屬性表示驗證錯誤所顯示信息,IsValid()方法則是表示驗證的值是否經過,下面咱們看一下框架給咱們提供的Model驗證特性類的簡單示例。spa

首先咱們仍是使用ASP.NET MVC Model驗證(一)中的示例代碼,看一下ViewModel使用了驗證特性類後的定義,示例代碼1-2.code

代碼1-2orm

namespace MvcApplication.Models
{
    /// <summary>
    /// ViewModel-用戶註冊信息
    /// </summary>
    public class RegistrationInformation
    {
        [Required]
        public string ID { get; set; }
        [Required]
        public string UserID { get; set; }
        [Required]
        [StringLength(10)]
        public string Password1 { get; set; }
        [Compare("Password1")]
        public string Password2 { get; set; }
        
        public string Name { get; set; }
    }
}

在代碼1-2中,咱們看到了一些應用於Model屬性上的特性類,下面簡單的說一下這幾種類型的含義。對象

Required:[Required],表示此屬性不得爲空(包括空字符串),固然了也能夠經過設置內部的AllowEmptyStrings屬性爲true後,則視爲能夠爲空。blog

StringLength:[StringLength(10)],表示此屬性值的字符串最大長度不能超過10。繼承

Compare:[Compare(「Password1」)],表示此屬性的值必須和指定屬性的值相同,示例中就是Password2的值必須和Password1屬性的值相同,否則就會提示驗證的錯誤信息ip

下面來一下項目運行後的結果圖,

圖1

圖1中故意輸入的這些數值,看下圖2是驗證後的結果

圖2

 

 

自定義ValidationAttribute特性類的示例實現

這一小節咱們直接來看自定義Model驗證特性類型,直接來看定義的示例代碼1-3.

代碼1-3

namespace MvcApplication.ModelValidators
{
    [AttributeUsage(AttributeTargets.Property,AllowMultiple=true,Inherited=false)]
    public class CustomModelValidatorAttribute:ValidationAttribute
    {

        public override bool IsValid(object value)
        {
            if (string.IsNullOrEmpty((string)value) || string.Compare((string)value, "jinyuan", true) == 0)
            {
                ErrorMessage = "不能爲空,或名稱不合法!";
                return false;
            }
            else
            {
                return true;
            }
        }
    }
}

這裏爲何要重寫基類的IsValid()方法,可能MVC框架會調用這個方法來判斷當前值是否經過驗證,這裏說一句題外話,在MVC框架中我翻看過默認綁定器類型的實現代碼,並無找到對Model驗證特性類的調用,哪位大神知道的話告知一下小弟感激涕零。

如今咱們再修改一下代碼1-2中的定義,示例代碼1-4.

代碼1-4

[CustomModelValidator]
public string Name { get; set; }

修改事後咱們看一下結果圖3和圖4.

圖3

圖4

看到這裏,有點不死心,想模擬實現一下默認綁定器的內部實現,這部份內容僅供參考,示例代碼1-5.

代碼1-5

public class CustomModelValidatorAttributeModelBinder : DefaultModelBinder
    {
        protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
        {
            base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
            foreach (Attribute att in propertyDescriptor.Attributes)
            {
                if (att is ModelValidators.CustomModelValidatorAttribute)
                {
                    ModelValidators.CustomModelValidatorAttribute mva = att as ModelValidators.CustomModelValidatorAttribute;
                    if (!mva.IsValid(value))
                    {
                        bindingContext.ModelState.AddModelError(propertyDescriptor.Name, mva.ErrorMessage);
                    }
                }
            }
        }
    }

在代碼1-5中咱們根據PropertyDescriptor類型的參數獲取到應用在Model屬性上的全部特性類,而後篩選到咱們自定義的類型,進行一個驗證判斷而後將其錯誤信息添加到ModelState中,須要把咱們自定義的這個Model綁定器註冊到系統中,運行的時候按照圖3的輸入,結果就跟圖4同樣。一樣的都能實現功能,這裏只是讓你們對默認的綁定器營造個遐想的空間。

 

吐槽下,博客園最近腫麼了?會有點小問題阿。剛發了郵件沒多會問題又給解決掉了,真心給力!!!

 

做者:金源

出處:http://www.cnblogs.com/jin-yuan/

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面

相關文章
相關標籤/搜索