朋友炒股兩個月賺了10萬,我幫他推廣一下公眾號,把錢用來投資總比放銀行連通貨膨脹都跑不過里強, 硬核離職,在家炒股 ,這是他每天的日志,有些經驗是花錢也買不到的。
本文目標
一、能夠使用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.其他驗證
詳細請查閱MSDN:http://msdn.microsoft.com/zh-cn/library/cc490428(v=vs.95).aspx
三、自定義正則表達式驗證
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.運行效果

