天天看點

ASP.NET MVC Model驗證(一) ASP.NET MVC Model驗證(一)

前面對于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>/// &lt;summary&gt;</code>

<code>    </code><code>/// ViewModel-使用者注冊資訊</code>

<code>    </code><code>/// &lt;/summary&gt;</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>&lt;</code><code>h2</code><code>&gt;Index&lt;/</code><code>h2</code><code>&gt;</code>

<code>@using (Html.BeginForm("ModelValidator","ModelValidator"))</code>

<code>    </code><code>&lt;</code><code>p</code><code>&gt;使用者注冊ID:@Html.EditorFor(m=&gt;m.ID)&lt;/</code><code>p</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>p</code><code>&gt;使用者名:@Html.EditorFor(m=&gt;m.UserID)&lt;/</code><code>p</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>p</code><code>&gt;登入密碼:@Html.EditorFor(m=&gt;m.Password1)&lt;/</code><code>p</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>p</code><code>&gt;再次輸入域密碼:@Html.EditorFor(m=&gt;m.Password2)&lt;/</code><code>p</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>input</code> <code>type</code><code>=</code><code>"submit"</code> <code>value</code><code>=</code><code>"送出"</code> <code>/&gt;</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>&lt;h2&gt;ModelValidator&lt;/h2&gt;</code>

<code>@Html.ValidationSummary()</code>

<code>&lt;p&gt;使用者注冊ID:@Html.EditorFor(m =&gt; m.ID)&lt;/p&gt;</code>

<code>&lt;p&gt;使用者名:@Html.EditorFor(m =&gt; m.UserID)&lt;/p&gt;</code>

<code>&lt;p&gt;登入密碼:@Html.EditorFor(m =&gt; m.Password1)&lt;/p&gt;</code>

<code>&lt;p&gt;再次輸入域密碼:@Html.EditorFor(m =&gt; m.Password2)&lt;/p&gt;</code>

在代碼1-5中,調用了Html.ValidationSummary()這個方法,這個視圖輔助器的作用就是為我們的Model驗證所産生的異常資訊生成Html代碼。

現在我們看一下項目運作效果圖1

圖1

ASP.NET MVC Model驗證(一) ASP.NET MVC Model驗證(一)

根據ModelValidator()方法中的驗證,我們故意這樣輸入的,看一下點選&amp;ldquo;送出&amp;rdquo;過後顯示到ModelValidator頁面,圖2

圖2

ASP.NET MVC Model驗證(一) ASP.NET MVC Model驗證(一)

有的朋友可能會說這樣顯示的不符合常理,哪裡有提示錯誤的資訊顯示在上面的,可以修改的,修改一下代碼1-5,示例代碼1-6.

代碼1-6

<code>&lt;p&gt;使用者注冊ID:@Html.EditorFor(m =&gt; m.ID)</code>

<code>@Html.ValidationMessageFor(m=&gt;m.ID)</code>

<code>&lt;/p&gt;</code>

<code>&lt;p&gt;使用者名:@Html.EditorFor(m =&gt; m.UserID)</code>

<code>@Html.ValidationMessageFor(m=&gt;m.UserID)&lt;/p&gt;</code>

<code>&lt;p&gt;登入密碼:@Html.EditorFor(m =&gt; m.Password1)</code>

<code>@Html.ValidationMessageFor(m=&gt;m.Password1)</code>

<code>&lt;p&gt;再次輸入域密碼:@Html.EditorFor(m =&gt; m.Password2)</code>

<code>@Html.ValidationMessageFor(m=&gt;m.Password2)</code>

修改過後我們還是使用先前使用的測試資料,看下最終的結果圖3.

圖3

ASP.NET MVC Model驗證(一) ASP.NET MVC Model驗證(一)

簡單的示範就到這裡,下一篇為大家講解Model驗證所處在MVC架構中的什麼位置以及大概的過程。

     本文轉自jinyuan0829 51CTO部落格,原文連結:http://blog.51cto.com/jinyuan/1436045,如需轉載請自行聯系原作者

繼續閱讀