中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NETMVC Model驗證(五)

發布時間:2020-08-08 09:18:25 來源:網絡 閱讀:1236 作者:jinyuan0829 欄目:編程語言

ASP.NETMVC Model驗證()

前言

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

Model驗證

  • Model驗證簡單運用示例

  • ModelValidator使用生成過程

  • 自定義實現DefaultModelBinder進行驗證

  • 自定義ModelValidatorProvider ModelValidator 

  • ValidationAttribute特性類使用

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

 

ValidationAttribute特性類使用

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

代碼1-1

public abstract class ValidationAttribute: Attribute
    {
        protectedValidationAttribute();
        protectedValidationAttribute(Func<string> errorMessageAccessor);
        protectedValidationAttribute(string errorMessage);
 
        // 摘要:
        //     獲取或設置一條在驗證失敗的情況下與驗證控件關聯的錯誤消息。
        //
        // 返回結果:
        //     與驗證控件關聯的錯誤消息。
        public string ErrorMessage { get;set; }
        public string ErrorMessageResourceName { get; set; }
        public Type ErrorMessageResourceType { get; set; }
        protectedstring ErrorMessageString { get; }
        public virtual stringFormatErrorMessage(string name);
        public ValidationResult GetValidationResult(object value, ValidationContextvalidationContext);
        //
        // 摘要:
        //     確定對象的指定值是否有效。
        //
        // 參數:
        //   value:
        //     要驗證的對象的值。
        //
        // 返回結果:
        //     如果指定的值有效,則為 true;否則,為 false。
        public virtual bool IsValid(object value);
        protectedvirtual ValidationResultIsValid(object value, ValidationContextvalidationContext);
        public void Validate(objectvalue, string name);
        public void Validate(objectvalue, ValidationContext validationContext);
}


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

首先我們還是使用ASP.NETMVC Model驗證()中的示例代碼,看一下ViewModel使用了驗證特性類后的定義,示例代碼1-2.

代碼1-2

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后,則視為可以為空。

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

Compare:[Compare(“Password1”)],表示此屬性的值必須和指定屬性的值相同,示例中就是Password2的值必須和Password1屬性的值相同,不然就會提示驗證的錯誤信息

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

1

ASP.NETMVC Model驗證(五)


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

2

ASP.NETMVC Model驗證(五)



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

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

代碼1-3

namespace MvcApplication.ModelValidators
{
    [AttributeUsage(AttributeTargets.Property,AllowMultiple=true,Inherited=false)]
    public class CustomModelValidatorAttribute:ValidationAttribute
    {
 
        public override boolIsValid(object value)
        {
            if(string.IsNullOrEmpty((string)value)|| string.Compare((string)value,"jinyuan", true) == 0)
            {
                ErrorMessage = "不能為空,或名稱不合法!";
                returnfalse;
            }
            else
            {
                returntrue;
            }
        }
    }
}


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

現在我們再修改一下代碼1-2中的定義,示例代碼1-4.

代碼1-4

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

修改過后我們看一下結果圖3和圖4.

3

ASP.NETMVC Model驗證(五)

4

ASP.NETMVC Model驗證(五)


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

代碼1-5

    public class CustomModelValidatorAttributeModelBinder: DefaultModelBinder
    {
        protectedoverride voidSetProperty(ControllerContextcontrollerContext, ModelBindingContextbindingContext, PropertyDescriptorpropertyDescriptor, object value)
        {
            base.SetProperty(controllerContext,bindingContext, propertyDescriptor, value);
            foreach(Attribute att inpropertyDescriptor.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一樣。同樣的都能實現功能,這里只是讓大家對默認的綁定器營造個遐想的空間。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宝坻区| 稷山县| 沧州市| 高阳县| 宿松县| 高唐县| 沁阳市| 康平县| 菏泽市| 皮山县| 宁南县| 宝应县| 昌江| 临桂县| 耒阳市| 宁夏| 澜沧| 枞阳县| 庆阳市| 北辰区| 双峰县| 都匀市| 紫阳县| 根河市| 桐城市| 濉溪县| 哈尔滨市| 嵊州市| 建宁县| 慈溪市| 宿松县| 台安县| 元氏县| 敦煌市| 虞城县| 新竹市| 中阳县| 醴陵市| 静海县| 荣成市| 屯门区|