前面對于Model綁定部分作了大概的介紹,從這章開始就進入Model驗證部分了,這個實際上是一個系列的Model的綁定往往都是伴随着驗證的。也會在後面的篇幅中講解MVC架構中Model驗證的機制,以及一些Model驗證的方式講解,本章隻是一個簡單的示例篇幅,對于有基礎的朋友可以直接跳過了(不能耽誤大家時間)。
Model驗證簡單運用示例
ModelValidator使用生成過程
自定義實作DefaultModelBinder進行驗證
自定義ModelValidatorProvider 和ModelValidator
ValidationAttribute特性類使用
自定義ValidationAttribute特性類的示例實作
ViewModel的定義
首先看一下ViewModel的定義,Model驗證當然離不開Model了,示例代碼1-1。
代碼1-1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<code>namespace</code> <code>MvcApplication.Models</code>
<code>{</code>
<code> </code><code>/// <summary></code>
<code> </code><code>/// ViewModel-使用者注冊資訊</code>
<code> </code><code>/// </summary></code>
<code> </code><code>public</code> <code>class</code> <code>RegistrationInformation</code>
<code> </code><code>{</code>
<code> </code><code>public</code> <code>string</code> <code>ID { </code><code>get</code><code>; </code><code>set</code><code>; }</code>
<code> </code><code>public</code> <code>string</code> <code>UserID { </code><code>get</code><code>; </code><code>set</code><code>; }</code>
<code> </code><code>public</code> <code>string</code> <code>Password1 { </code><code>get</code><code>; </code><code>set</code><code>; }</code>
<code> </code><code>public</code> <code>string</code> <code>Password2 { </code><code>get</code><code>; </code><code>set</code><code>; }</code>
<code> </code><code>public</code> <code>string</code> <code>Name { </code><code>get</code><code>; </code><code>set</code><code>; }</code>
<code> </code><code>}</code>
<code>}</code>
代碼1-1中,定義了RegistrationInformation類型包含着一些注冊資訊的屬性。
配置環境
有了ViewModel過後我們需要資料展示頁面,我們定義個ModelValidatorController控制器,并且在其中定義了Index()方法,用于顯示頁面提供給使用者輸入注冊的資訊。示例代碼1-2.
代碼1-2
<code>namespace</code> <code>MvcApplication.Controllers</code>
<code> </code><code>public</code> <code>class</code> <code>ModelValidatorController : Controller</code>
<code> </code><code>public</code> <code>ActionResult Index()</code>
<code> </code><code>{</code>
<code> </code><code>return</code> <code>View(</code><code>new</code> <code>Models.RegistrationInformation());</code>
<code> </code><code>}</code>
然後我們還要定義頁面的代碼,也就是對應Index()方法的Index視圖,示例代碼1-4.
代碼1-3
<code>@model MvcApplication.Models.RegistrationInformation</code>
<code>@{</code>
<code> </code><code>ViewBag.Title = "Index";</code>
<code><</code><code>h2</code><code>>Index</</code><code>h2</code><code>></code>
<code>@using (Html.BeginForm("ModelValidator","ModelValidator"))</code>
<code> </code><code><</code><code>p</code><code>>使用者注冊ID:@Html.EditorFor(m=>m.ID)</</code><code>p</code><code>></code>
<code> </code><code><</code><code>p</code><code>>使用者名:@Html.EditorFor(m=>m.UserID)</</code><code>p</code><code>></code>
<code> </code><code><</code><code>p</code><code>>登入密碼:@Html.EditorFor(m=>m.Password1)</</code><code>p</code><code>></code>
<code> </code><code><</code><code>p</code><code>>再次輸入域密碼:@Html.EditorFor(m=>m.Password2)</</code><code>p</code><code>></code>
<code> </code><code><</code><code>input</code> <code>type</code><code>=</code><code>"submit"</code> <code>value</code><code>=</code><code>"送出"</code> <code>/></code>
代碼1-3中的表單被定義指向了ModelValidatorController控制器的ModelValidator()方法,這裡抱歉我沒有把命名的定義很好的區分開。
既然代碼1-3中指向了ModelValidator()方法,這個時候我們需要修改示例代碼1-2中的代碼,添加示例代碼1-4到示例代碼1-2中。
代碼1-4
15
16
17
18
19
20
21
22
23
24
25
26
27
<code> </code><code>public</code> <code>ActionResult ModelValidator(RegistrationInformation regInfo)</code>
<code> </code><code>if</code> <code>(</code><code>string</code><code>.IsNullOrEmpty(regInfo.ID) || regInfo.ID == </code><code>""</code><code>)</code>
<code> </code><code>{</code>
<code> </code><code>this</code><code>.ModelState.AddModelError(</code><code>"ID"</code><code>, </code><code>"請輸入ID,ID不能為空!"</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>if</code> <code>(</code><code>string</code><code>.IsNullOrEmpty(regInfo.UserID) || regInfo.UserID == </code><code>""</code><code>)</code>
<code> </code><code>this</code><code>.ModelState.AddModelError(</code><code>"UserID"</code><code>, </code><code>"請輸入使用者賬戶,使用者賬戶不能為空!"</code><code>);</code>
<code> </code><code>if</code> <code>(</code><code>string</code><code>.IsNullOrEmpty(regInfo.Password1) || regInfo.Password1 == </code><code>""</code><code>)</code>
<code> </code><code>this</code><code>.ModelState.AddModelError(</code><code>"Password1"</code><code>, </code><code>"請輸入登入密碼,登入密碼不能為空!"</code><code>);</code>
<code> </code><code>if</code> <code>(</code><code>string</code><code>.IsNullOrEmpty(regInfo.Password2) || regInfo.Password2 == </code><code>""</code><code>)</code>
<code> </code><code>this</code><code>.ModelState.AddModelError(</code><code>"Pssword2"</code><code>, </code><code>"請再次輸入密碼,密碼不能為空!"</code><code>);</code>
<code> </code><code>if</code> <code>(!</code><code>string</code><code>.IsNullOrEmpty(regInfo.Password2))</code>
<code> </code><code>if</code> <code>(regInfo.Password2 != regInfo.Password1)</code>
<code> </code><code>{</code>
<code> </code><code>this</code><code>.ModelState.AddModelError(</code><code>"Password2"</code><code>, </code><code>"請重新輸入密碼,與上次輸入密碼不同"</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>return</code> <code>View(regInfo);</code>
在代碼1-4中就是對Model進行了驗證,可以看到是簡單的驗證,判斷不能為空了、輸入的兩次密碼要相同了。
1-4中是已經進行了Model綁定,系統已經執行到了控制器方法内部了,并且在其内進行的Model驗證,而真正的驗證是在Model綁定階段,這部分内容下篇會有講解。
下面我們再來看一下ModelValidator()方法所對應的視圖定義,代碼1-5.
代碼1-5
<code> </code><code>ViewBag.Title = </code><code>"ModelValidator"</code><code>;</code>
<code><h2>ModelValidator</h2></code>
<code>@Html.ValidationSummary()</code>
<code><p>使用者注冊ID:@Html.EditorFor(m => m.ID)</p></code>
<code><p>使用者名:@Html.EditorFor(m => m.UserID)</p></code>
<code><p>登入密碼:@Html.EditorFor(m => m.Password1)</p></code>
<code><p>再次輸入域密碼:@Html.EditorFor(m => m.Password2)</p></code>
在代碼1-5中,調用了Html.ValidationSummary()這個方法,這個視圖輔助器的作用就是為我們的Model驗證所産生的異常資訊生成Html代碼。
現在我們看一下項目運作效果圖1
圖1

根據ModelValidator()方法中的驗證,我們故意這樣輸入的,看一下點選&ldquo;送出&rdquo;過後顯示到ModelValidator頁面,圖2
圖2
有的朋友可能會說這樣顯示的不符合常理,哪裡有提示錯誤的資訊顯示在上面的,可以修改的,修改一下代碼1-5,示例代碼1-6.
代碼1-6
<code><p>使用者注冊ID:@Html.EditorFor(m => m.ID)</code>
<code>@Html.ValidationMessageFor(m=>m.ID)</code>
<code></p></code>
<code><p>使用者名:@Html.EditorFor(m => m.UserID)</code>
<code>@Html.ValidationMessageFor(m=>m.UserID)</p></code>
<code><p>登入密碼:@Html.EditorFor(m => m.Password1)</code>
<code>@Html.ValidationMessageFor(m=>m.Password1)</code>
<code><p>再次輸入域密碼:@Html.EditorFor(m => m.Password2)</code>
<code>@Html.ValidationMessageFor(m=>m.Password2)</code>
修改過後我們還是使用先前使用的測試資料,看下最終的結果圖3.
圖3
簡單的示範就到這裡,下一篇為大家講解Model驗證所處在MVC架構中的什麼位置以及大概的過程。
本文轉自jinyuan0829 51CTO部落格,原文連結:http://blog.51cto.com/jinyuan/1436045,如需轉載請自行聯系原作者