前端傳到後端數據的不可信任性,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 特性中包含此類時,可使用此類來驗證這些項。 |
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>