本篇将是介绍MVC的简单应用,以及介绍本项目的最后一个章节(暂告段落)。将主要为大家介绍Html扩展方法中的“数据验证”这一部分。之所以本系列的题目为“专题研究”,意味深长,笔者将在今后有空之日陆续推出新作,深入研究自定义URL以及自定义视图等问题,敬请期待。好,下面就进入正题——

 

一、数据验证概述:

在与用户交互的界面中(诸如笔者示例项目中的AddItemAddTypeEdit两个视图)都需要用户内容后按下“Save As……”按钮才能够被Controller捕获并且自动存入相应的数据库中。但是这数据不是“神来之笔”,必须具备一定的条件的——拿Add开头的视图而言,你要考虑的是:

1、输入项不能为空(指“空格”,没有一个字符,全部是Space键字符的组合,同时不能为null)。

2、输入项类型匹配(比如Money这个必须是数字,你不能弄一个字符(串)混入其中,比如因为用户粗心大意而输入了“123O5”,其中“O”是字母而不是数字零)此类问题。

当然,实际上远远有比这些更复杂的问题存在。不过我们暂且根据此项目的要求给读者一个简单又明确的交代——通常情况下,要验证数据“非空”问题不得不求助于aspx的“数据验证”控件(通常可以使用RequiredValidatorRegularExpressValidator等)。当然我也有足够理由相信前两个控件在对付“null”和“类型转换”检查上是绰绰有余的。不过在“非常时刻”(比如验证全部是空格的“空”字符串和具备一些特定要求的验证)情况下,常用的数据验证控件显然不够用了,那么我们不得不使用CustomValidator进行验证。这些是常见的、普通aspx程序设计中需要注意的事项。那么我们在MVC中是不是也有那么方便呢?

 

二、MVC中的数据验证:

既然微软在aspx中提供了这些常见的数据验证控件给予方便,同样地,作为微软大力倡导的MVC也不例外。因为MVC是纯Html代码,因此不存在拖拽控件,设置属性等视图操作,我们必须手写代码,不知大家是否注意过我的Model层的代码的改动?(Model是一个Linq-To-Sql内嵌工具自生成的,实际上是Model+DAL的混合物,为方便起见放入Model了)。如果你没有注意,请务必认真看在每一个映射tableclass上我加了什么?以下是片段:

[Required(ErrorMessage="FinanceName cannot be null!")]

[Column(Storage = "_financeName", DbType = "VarChar(20) NOT NULL", CanBeNull = false)]

        public string financeName

        {

            get

            {

                return this._financeName;

            }

……

}

请看我使用红色粗体字样标示的部分——哎,这个属性好像我在Model中没有见过吗?怎么平白无故出来的?而且我为什么打不出来?实际上,它从英文字面上就知道是映射aspx编程的RequiredValidator控件,避免用户漏输入而造成插入空值(null)。之所以你的智能感知没有出现这个属性的提示,是因为您少导入了一个重要的命名空间——System.ComponentModel.DataAnnotations,它隶属于system.ComponentModel.DataAnnotations.dll文件,一般使用MVC模板的会自动引入这个类,您所要做的只是导入(手动书写)在Model类的using处就OK了。当然,罗嗦一句,凡是实体类都可以使用这个方法。下面列举其中的一些主要的验证属性和参数:

验证类

参数简略说明

1Required(string errorMessage)

设置显示错误之后向用户报告的信息,该信息不会显示在被验证的控件边,将会显示在ValidationSummary控件中。

2RegularExpression(string Pattern, string errorMessage)

正则表达式验证。Pattern:正则表达式,后面一个参数同Reqiured的(以下也相同)。

3StringLength(int length, string errorMessage)

字符串最大长度验证。length:最大允许的长度(中英文都算一个字符)。

4Range(int startnum,int endnum,string errorMessage)

用于设定一定范围。startnum:起始数字,endnum:结尾数字。

非常简单,您只要确定某个实体类的属性需要哪些验证,您就像我一样在该实体类“公有属性”上添加该验证模块就可以了。不过不要忘记:添加完后请务必重新编译您的实体类

那么如何让这些验证“自动生效”呢?你观察我的示例程序,就会发现无论是AddItemAddType还是Edit,几乎都是这样公式的代码:

public ActionResult XXX(SomeClass paramName)

{

if(!Model.IsValid)

{

return View();

}

……

}

此处显然笔者为了方便使用了“数据绑定”中的“类绑定”技术(之前一篇文章已经叙述),不过请注意粗体字部分——判断这个动态绑定的Model是否合法是关键,它会自动根据绑定的类,动态比对每个属性的当前值,和实体类的数据验证进行比对,一旦不符合某个条件,就会触发一个Error异常,自动把IsValid设置成False。在ValidationSummary中用列表形式<li>显示出您定义的对应ErrorMessage来。所以一般地,ValidationSummary也是不可或缺的一个元素,它的定义很简单:

<%=ValidationSummary(string tip)%>

其中tip是提示语,用作显示出错信息前的提示。如果有多个控件需要验证,您可以设置(类似笔者Edit中那个定义。当然,此处可以省略,就像笔者AddType只有一个验证的,就没有必要定义提示语了。

当然,此处还用到了Html扩展方法自动生成TextBox等内容,同时还是用到了ValidationMessage类,这是一个专门用于绑定某个控件,以实现验证的类——

<%=ValidationMessage(string modelName, object value)%>

其中第一个参数为“对哪个类属性进行验证”,既然要使得“类绑定”实现,那么一个HTMLname肯定要和实体类的某个属性一致,既然如此,那么modelName也势必和HTMLname是一致的。总结概括:一般地,被验证的实体类.属性=HTML控件.name=ValidationMessagemodelName。至于第二个参数,是用于进一步提示用户你那个地方出错了,比如读者设定了“*”,那么某个地方违反规定之后就会在那个控件处出现一个红色的星。

在此笔者提醒您:

在数据为空(全部是空格、是null),或者是因为类型不匹配(比如Money是数值型,您输入了“123O4”)等问题时,系统都会自行验证。因此此处完全可以使用Required,您不必写自定义验证(当然,自定义数据验证问题将在以后的篇章中详细阐述)。

Html中的扩展方法还可以使用EditForModelDisplayForModel方法直接生成类似ViewEdit的视图,此时您不必劳心劳力地自定一个个定义TextBox等和放置ValidationMessage内容,只需要在实体类上设置好一些验证方式,放上ValidationSummary以及类绑定,万事OK

数据验证可以设定自己的CSS样式,实际上你看笔者的Shared文件夹中一个自生成的CSS文件中就能够找到以下一些CSS样式,你可以自定义更改不同的样式,但请不要更改CSS的名称,以免系统无法找到,它们对应关系如下:

名称

对应的验证设置

field-validation-error

ValidationMessage第二个参数的样式。

input-validation-error

被绑定的HTML控件验证失败后的样式。

validation-summary-errors

ValidationSummary列表出错信息样式。

posted on 2009-11-28 11:00  maledong  阅读(1508)  评论(0编辑  收藏  举报