DRY("Don't Repeat Yourself")是MVC的設計原則之一。ASP.NET MVC鼓勵你只定義一次功能或行爲,而後在應用程序中各處進行使用。這會大大
減小須要編寫的代碼量,使你的代碼不容易出錯,更便於測試和維護。html
MVC和Entity Framework Core Code First所提供的驗證功能是實際應用中DRY原則的一個很好的實例。你能夠在一個地方(在模型類中)聲明指定的驗證規則,在整個應用中生效。數據庫
DataAnnotations提供了一組內置的驗證特性,你能夠應用在任何類或者屬性中。(字也包含了相似於DataType
這樣的格式化特性來幫助你格式化數據而不是提供任何驗證功能)瀏覽器
添加內置的Required
,StringLength
,RegularExpression
和Range
驗證特性。服務器
public class User { public int ID { get; set; } [Display(Name = "姓名")] [StringLength(10, MinimumLength = 3)] [Required] public string Name { get; set; } [Display(Name = "郵箱")] [DataType(DataType.EmailAddress)] public string Email { get; set; } [Display(Name = "身高")] [Required] [Range(150, 230)] public decimal Height { get; set; } [Display(Name = "職稱")] public string Title { get; set; } [Display(Name = "部門")] public string Dept { get; set; } [Display(Name = "簡介")] public string Bio { get; set; } }
其中Required
和MinimumLength
Attribute表示屬性不能爲空;但沒法阻止用戶輸入空格來知足該驗證條件。RegularExpression
Attribute用來限制用戶能夠輸入的字符。Range
Attribute限制值必須在指定的範圍內。StringLength
Attribute可以讓你設置字符串的最大長度,和可選的最小長度。值類型(例如decimal
,int
,float
,DateTime
)是自身必須的,不須要[Required]
Attribute。mvc
在輸入錯誤的數據時,jQuery客戶端驗證立刻會發現錯誤,並顯示一個錯誤信息。注意表單在每一個包含無效數據的字段下自動呈現適當的驗證錯誤消息。錯誤會在客戶端(使用JavaScript和jQuery)和服務器端執行。asp.net
你會發現你不須要修改UserController
類或者Create.cshtml視圖中的一行代碼,就能夠驗證UI。以前建立的Controller和視圖會自動使用你在User
模型類中屬性上指定的驗證特性規則。使用Edit
操做方法測試驗證,一樣會生效。async
你可能會好奇在沒有對控制器或者視圖進行更新的狀況下驗證UI是如何產生的。post
// GET: User/Create public IActionResult Create() { return View(); } // POST: User/Create // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create([Bind("ID,Name,Email,Bio,Height,Title,Dept")]User user) { if (ModelState.IsValid) { _context.Add(user); await _context.SaveChangesAsync(); return RedirectToAction("Index"); } return View(user); }
第一個(HTTP GET)Create
方法顯示初始的Create表單。第二個([HttpPost]
)版本負責處理POST請求,經過調用ModelState.IsValid
來檢查是否有任何驗證錯誤。調用該方法會驗證任何已應用到對對象上的驗證。若是對象有驗證錯誤,Create
方法會從新顯示錶單。若是沒有錯誤,方法會保存數據到數據庫。測試
在這個例子中,在客戶端驗證檢測到錯誤時,表單不會POST到服務器,若是你在瀏覽器中禁用了JS,客戶端驗證將會禁用,那麼HTTP POST Create
方法中的ModelState.IsValid
會檢測任何驗證錯誤。ui
Input Tag Helper
會使用(Consume)DataAnnotations
特性並在客戶端產生(Produce)jQuery驗證所須要的HTML屬性。Validation Tag Helper
負責顯示驗證錯誤。
很是Nice的是這個方案控制器和視圖模板不須要知道任何實際執行的驗證規則或者具體的錯誤消息。驗證規則和錯誤字符串只在模型類中指定。一樣的騅規則會自動地應用到任何你想要建立或者修改該Model的視圖模板。
當你想更改驗證邏輯時,你只須要在一個地方給Model添加驗證特性。不用擔憂應用的不一樣部分執行不一樣的驗證規則 - 全部的驗證邏輯在同一個地方定義,在各處使用。這意味着你充分遵循了DRY原則。
System.ComponentModel.DataAnnotations
命名空間提供了內置的驗證特性之外的格式化特性。好比:
[Display(Name = "生日")] [DataType(DataType.Date)] public DateTime BirthDate { get; set; } [Range(8000, 10000)] [DataType(DataType.Currency)] public decimal Salary { get; set; }
DataType
特性只用於視圖引擎對數據進行格式化(以及爲URL提供<a>
標籤和爲Email提供<a href="mailto:EmailAddress.com">
)。你可使用RegularExpression
特性驗證數據的格式。DataType
特性用於指定比數據庫自己類型更爲具體的數據類型,它們不是驗證特性,這本例中,咱們只須要跟蹤日期,而不須要具體的時間。
在DataType
枚舉中提供了不少的數據類型,例如Date, Time, PhoneNumber, Currency, EmailAddress等。DataType
特性可讓應用自動提供特定數據類型的特徵。例如,DataType.EmailAddress
能夠建立mailto:
連接,DataType.Date
能夠在瀏覽器提供一個日期選擇器。DataType
特性會產生HTML 5瀏覽器所支持的HTML 5 data-
屬性。DataType
不提供任何驗證。
DataType.Date
不是指定日期的顯示格式。默認狀況,數據字段默認的顯示格式是基於服務器的CultureInfo
設置來決定的。