天天看点

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,如需转载请自行联系原作者

继续阅读