無廢話MVC入門教程六[Model中的驗證規則]
學習.NET MVC 只看在《無廢話系列》足夠了,《無廢話系列》簡單、快速、直接。
本文目標
一、能夠使用Model的Attribute進行服務端資料驗證
本文目錄
一、概述
二、MVC提供的常用上下文
三、自定義正則表示式驗證
一、概述
為了確保資料的安全性,由Client傳送到服務端的每一項資料我們都會做嚴格的資料校驗。MVC做資料校驗一般都會寫在Model的Attribute上,程式碼看起來更加優雅、簡潔。在下面的介紹中我們對校驗進行了歸類,一種是MVC框架裡提供的預設校驗方式、另一種通過繼承來實現自定義規則。
二、MVC提供的常用上下文
1.Model中的程式碼
1 using System.ComponentModel.DataAnnotations; 2 3 namespace MVC3.Demo.Models 4 { 5 public class ValidationModel 6 { 7 [Display(Name = "特殊數字")] 8 [Required(ErrorMessage = "請輸入{0}")] 9 [StringLength(20, ErrorMessage = "{0}在{2}位至{1}位之間", MinimumLength = 1)] 10 public string InputNumber { get; set; } 11 } 12 }
[Display(Name = "特殊數字")]:檢視如顯示的名稱,具體看執行效果。
[Required(ErrorMessage = "請輸入{0}")]:InputNumber是必須填寫的,如果不填寫ErrorMessage屬性的值將以顯示在頁面上。{0}為Display中Name屬性的佔位符。
[StringLength(20, ErrorMessage = "{0}在{2}位至{1}位之間", MinimumLength = 1)]:字串長度為:1-20之間。{0}、{1}、{2}分別為引數的佔位符。
2.View中的程式碼
1 @model MVC3.Demo.Models.ValidationModel 2 @{ 3 Layout = null; 4 } 5 <!DOCTYPE html> 6 <html> 7 <head> 8 <title>ModelValidation</title> 9 </head> 10 <body> 11 <div> 12 @using (Html.BeginForm()) 13 { 14 <div> 15 @Html.LabelFor(model => model.InputNumber) 16 @Html.TextBoxFor(model => model.InputNumber) 17 @Html.ValidationMessageFor(model => model.InputNumber) 18 </div> 19 <div> 20 <input type="submit" value="提交" /> 21 </div> 22 } 23 </div> 24 </body> 25 </html>
@Html.LabelFor(model => model.InputNumber):顯示Model中的DisplayAttribute的Name屬性
@Html.ValidationMessageFor(model => model.InputNumber):顯示錯誤資訊的HtmlHelper
3.Control中的程式碼
1 public ActionResult ModelValidation() 2 { 3 return View(); 4 } 5 6 [HttpPost] 7 public ActionResult Validation(Models.ValidationModel model) 8 { 9 if (ModelState.IsValid) 10 { 11 var inputNumber = model.InputNumber; 12 } 13 return View(); 14 }
ModelState.IsValid:校驗客戶端資料是否全部符合驗證規則
4.執行效果
5.其他驗證
三、自定義正則表示式驗證
1.常規方式
1 using System.ComponentModel.DataAnnotations; 2 3 public class ValidationModel 4 { 5 [RegularExpression(@"^[0-5]*$", ErrorMessage = "只能輸入0-5間的數字")] 6 public string InputNumber { get; set; } 7 }
[RegularExpression(@"^[0-5]*$", ErrorMessage = "只能輸入0-5間的數字")]:第一個引數為要驗證的正責表示式,第二個引數為錯誤訊息。
如果有多個Model中的屬性都要使用這個正責表示式,那麼“常規方式”顯得程式碼大量的冗餘
2.繼承方式
用一個類去繼承RegularExpressionAttribute,從而達到封裝正責表示式和錯誤訊息作用,類程式碼如下:
1 using System; 2 using System.ComponentModel.DataAnnotations; 3 4 namespace MVC3.Demo.App_Code 5 { 6 public class SpecialValidation : RegularExpressionAttribute 7 { 8 public SpecialValidation() : base(@"^[0-5]*$") { } 9 10 public override string FormatErrorMessage(string name) 11 { 12 return String.Format("{0}在0-5之間", name); 13 } 14 } 15 }
使用程式碼如下:
1 using System.ComponentModel.DataAnnotations; 2 using MVC3.Demo.App_Code; 3 4 namespace MVC3.Demo.Models 5 { 6 public class ValidationModel 7 { 8 [SpecialValidation] 9 public string InputNumber { get; set; } 10 } 11 }
上面的程式碼效果等同於:[RegularExpression(@"^[0-5]*$", ErrorMessage = "{0}只能輸入0-5間的數字")]
3.執行效果