【MVC】ASP.NET MVC之數據驗證

前端傳到後端數據的不可信任性,DRY("Don't Repeat Yourself") 設計原則。MVC3.0出了後端數據驗證特性,鼓勵你只定義一次功能或行爲,然後在應用程序中各處進行使用。這會大大減少需要編寫的代碼量,使你的代碼不容易出錯,更便於測試和維護。

System.ComponentModel.DataAnnotations 命名空間提供定義 ASP.NET MVC 和 ASP.NET 數據控件的類的特性。

AssociationAttribute

指定實體成員表示數據關係(如外鍵關係)。

CompareAttribute

提供用於比較兩個屬性的特性。

ConcurrencyCheckAttribute

指定屬性參與樂觀併發檢查。

CreditCardAttribute

指定數據字段值是信用卡號。

CustomValidationAttribute

指定用於驗證屬性或類實例的自定義驗證方法。

DataTypeAttribute

指定要與數據字段關聯的其他類型的名稱。

DisplayAttribute

提供允許爲實體分部類的類型和成員指定可本地化字符串的通用特性。

DisplayColumnAttribute

指定作爲外鍵列顯示在被引用表中的列。

DisplayFormatAttribute

指定 ASP.NET 動態數據如何顯示數據字段以及如何設置數據字段的格式。

EditableAttribute

指示數據字段是否可編輯。

EmailAddressAttribute

驗證電子郵件地址。

EnumDataTypeAttribute

啓用 .NET Framework 枚舉,以映射到數據列。

FileExtensionsAttribute

驗證文件擴展名。

FilterUIHintAttribute

表示用於指定列的篩選行爲的特性。

KeyAttribute

表示唯一標識實體的一個或多個屬性。

MaxLengthAttribute

指定屬性中允許的數組或字符串數據的最大長度。

MinLengthAttribute

指定屬性中允許的數組或字符串數據的最小長度。

PhoneAttribute

指定數據字段值是格式標準的電話號碼。

RangeAttribute

爲數據字段的值指定數值範圍約束。

RegularExpressionAttribute

指定 ASP.NET 動態數據中的數據字段值必須與指定的正則表達式匹配。

RequiredAttribute

指定數據字段值是必需的。

ScaffoldColumnAttribute

指定類或數據列是否使用基架。

StringLengthAttribute

指定數據字段中允許的字符的最小長度和最大長度。

TimestampAttribute

列的數據類型指定爲行版本。

UIHintAttribute

指定動態數據用來顯示數據字段的模板或用戶控件。

UrlAttribute

提供 URL 驗證。

ValidationAttribute

充當所有驗證特性的基類。

ValidationContext

描述執行驗證檢查的上下文。

ValidationException

表示在使用 ValidationAttribute 類的情況下驗證數據字段時發生的異常。

ValidationResult

表示驗證請求的結果的容器。

Validator

定義一個幫助器類,在與對象、屬性和方法關聯的 ValidationAttribute 特性中包含此類時,可使用此類來驗證這些項。

core微軟官方文檔

 

Controller層數據驗證:

   if (!ModelState.IsValid)
     {
        var errorList = ModelState.Values.Where(t => t.Errors.Count > 0)
              .Select(t
=> t.Errors).ToList(); string errorMessage = "以下字段驗證無效:" + "<br/>"; errorList.ForEach(t => { errorMessage += t[0]?.ErrorMessage + "<br/>"; }); return FailureResult(errorMessage); }

 

ViewModel:

    public class TestViewModel
    {
        //Required默認爲不允許爲空。允許爲空則添加AllowEmptyStrings = true
        [Required(AllowEmptyStrings = true)]
        [StringLength(20, ErrorMessage = "密碼不能超過20個字符")]
        public string Password { get; set; }

        [Compare("Password", ErrorMessage = "兩次輸入的密碼不一致")]
        public string PasswordConfirm { get; set; }

        [Range(0, 120, ErrorMessage = "年齡取值範圍0-120")]
        public int Age { set; get; }

        [RegularExpression(@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$", ErrorMessage = "郵箱格式不正確")]
        public string Email { get; set; }
        
        [Range(typeof(DateTime), "2000-01-01", "2099-12-31",ErrorMessage = "日期範圍{0}-{1}")]
        public DateTime AsOfDate { get; set; }
        
        [Range(typeof(decimal), "0", "100", ErrorMessage = "票息範圍{0}-{1}")]
        public decimal CouponRate { get; set; }
        
        [StringLength(10, MinimumLength = 3, ErrorMessage = "最少{0}位,最多{1}位")]
        public string Method { get; set; }

        [DataType(DataType.DateTime)]
        public DateTime Date { get; set; }

        [FileExtensions(Extensions = "jpg,jpeg",ErrorMessage="擴展名必須爲{0}")]
        public string FileName { get; set; }

        [CountryName(ErrorMessage="國家必須填寫中國")]
        public string Country { get; set; }
    }


    /// <summary>
    /// 自定義驗證特性  繼承ValidationAttribute
    /// </summary>
    public class CountryNameAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            return (string) value == "中國";
        }
    }

 

多語言下的資源文件自定義錯誤:

<data name="Com0000000080" xml:space="preserve">
<value>總數範圍:{1}-{2} !</value>
</data>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章