mvc基础系列说谈(7)——数据验证(下)

简介: 这篇说一下数据注释验证(Data Annotation Validators) 这种验证方式在1.0里是不被支持的,但在.net4.0和2.0中会被支持。所以如果要在1.0中使用(我用的是vs2008和mvc 1.

这篇说一下数据注释验证(Data Annotation Validators

这种验证方式在1.0里是不被支持的,但在.net4.02.0中会被支持。所以如果要在1.0中使用(我用的是vs2008mvc 1.0),要一些准备工作:

先要添加两个库文件:

·Microsoft.Web.Mvc.DataAnnotations.dll

·System.ComponentModel.DataAnnotations.dll

这两个都要到网站去下载

http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471

下载Data Annotations Model Binder Sample 这个(Recommended default)

下载下来后,启动项目,然后生成库文件,就可以在bin/debug里找到这个文件了。

如果不使用下载的System.ComponentModel.DataAnnotations.dll这个库,而使用3.5的,会出现版本冲突。

 

在工程里添加对这两个库的引用,且在Global.asax文件中添加(黑体部分):

protected   void  Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    ModelBinders.Binders.DefaultBinder 
=  
    
new  Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder();
}

 

这种验证类包含4类修饰:

Range(范围):验证属性的范围值

RegularExpression(正则表达式):以正则表达式来验证属性值(指导中这个词写错了)

Required(不为空):验证属性不为空

StringLength(字串长度):验证字串属性最大长度

 

其中它们的基类是:Validation。有时候如果自定义修饰标签,可以从这个类派生

 

现在还以Customer为例:

[Required(ErrorMessage = " 名字不能为空 " )]
[RegularExpression(
@" \d{1} " ,ErrorMessage = " 不能大于10 " )]
[Column(Storage
= " _FirstName " , DbType = " VarChar(50) " )]
public   string  FirstName
{
    ……
}

 

[Required(ErrorMessage  =   " 姓氏不能为空 " )]
[Column(Storage
= " _LastName " , DbType = " VarChar(50) " )]
public   string  LastName
{
    ……
}

 

这里只贴一部分。因为我这是直接在dbml代码文件里加的,所以多出1行修饰。其中加粗部分为数据注释验证(修饰标签)

 

在前台的效果如下:

Create

Create was unsuccessful. Please correct

 the errors and try again.

  • 名字不能为空

  • 姓氏不能为空

窗体顶端

FirstName: *

LastName: *

窗体底端

 

 

有些情况下这种验证方式比较好,但在有些情况下这种验证方式并不适合,所以要在不同的环境情况下使用适当的验证方式。

 

控制器动作中的验证剥离

这里将控制器动作中的验证(一堆的if语句)分离开来,而动作中只判断Customer

(一)到方法

在控制器中添加:

private  ModelStateDictionary _modelState;
private   bool  ValiCustomer(Customer customer,ModelStateDictionary modelState)
{
    _modelState 
=  modelState;
    
if  (customer.FirstName  ==   string .Empty)
    {
        _modelState.AddModelError(
" FirstName " " 名字不能为空! " );
    }

    
if  (customer.LastName  ==   string .Empty)
    {
        _modelState.AddModelError(
" LastName " " 姓氏不能为空! " );
    } 

    
if  (Convert.ToInt32(customer.FirstName)  >   10 )
    {
        _modelState.AddModelError(
" FirstName " " 名字不能大于! " );
    }
    
return  _modelState.IsValid;
}

 

然后,在Create动作中:

if ( ! ValiCustomer(customer, this .ModelState))
{
    
return  View();
}
return  RedirectToAction( " Index " );

 

这在一定程度上实现了分离

(二)指导中的分离

在提供的指导教程中,把验证做为单独的服务层来做的。而且是在创建时验证。

现在按指导中的例子,把验证做为单独的服务层来做,但不在创建时验证,而是在创建前验证。

public   interface  ICustomer
{
    
bool  CreateProduct(Customer customerToCreate);


public   class  ValiService : ICustomer
{
    
private  ModelStateDictionary _modelState;
    
public  ValiService(ModelStateDictionary modelState)
    {
        _modelState 
=  modelState;
    }

    
public   bool  CreateProduct(Customer customerToCreate)
    {
        
if  (customerToCreate.FirstName  ==   string .Empty)
        {
            _modelState.AddModelError(
" FirstName " " 名字不能为空! " );
        }

        
if  (customerToCreate.LastName  ==   string .Empty)
        {
            _modelState.AddModelError(
" LastName " " 姓氏不能为空! " );
        } 

        
if  (Convert.ToInt32(customerToCreate.FirstName)  >   10 )
        {
            _modelState.AddModelError(
" FirstName " " 名字不能大于10! " );
        }

        
return  _modelState.IsValid;
    }
}

 

在动作中:

控制器构造器有动作:

public  CustomerController() 
{
    _service 
=   new  ValiService( this .ModelState);


if  ( ! _service.CreateProduct(customer))
    
return  View();
return  RedirectToAction( " Index " );
 

 

当建立mvc应用程序时,应该不要把数据库逻辑放在控制器的动作中进行。对于其它的业务逻辑也要尽量参照这个原则。控制器的动作只用来加载模型,返回视图。对于加载的模型要一次到位(自己这样理解)。

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
28个残疾人,两个月,被阿里客服改变的命运
十年里,阿里巴巴云客服累计免费培训了35万人,为11万人提供了就业岗位,这28个残疾人也正是这11万人中的一份子。
28个残疾人,两个月,被阿里客服改变的命运
|
8月前
|
传感器 人工智能 编解码
一文彻底拿捏PCB的发展历程
本文回顾了印制电路板(PCB)从20世纪初至今的发展历程,详述了各阶段的关键技术突破及其对电子产业的影响。从早期的手工焊接到现代的高密度互连(HDI)、柔性PCB和智能化集成,PCB技术不断演进,满足了电子设备小型化、高性能的需求,并推动了全球电子产业的快速发展。文章还探讨了环保制造工艺和可持续发展的趋势。
308 1
|
存储 机器学习/深度学习 人工智能
神经网络推理加速入门——计算和存储的分离
硬件优化对于计算的加速效果是显而易见的,理解了底层硬件的原理,可以帮助我们更好的完成计算优化。
神经网络推理加速入门——计算和存储的分离
|
存储 安全 Shell
CVE-2021-21972-VMware vCenter漏洞学习
CVE-2021-21972-VMware vCenter漏洞学习
1021 0
CVE-2021-21972-VMware vCenter漏洞学习
|
小程序 JavaScript Java
关于聚合CPS返利商城开发系统搭建技术
对于后台管理系统,我们常规的PHP和JAVA开发,相对来说PHP比JAVA简单点。具体使用什么语言开发后台,根据你们学校要求来,如果没要求可以用PHP。当然使用JAVA、python都是可以的
关于聚合CPS返利商城开发系统搭建技术
|
Java
证券量化交易平台-接入业务:SpringBoot 集成Apama
什么是APAMA, 中国银河证券与Progress® Apama®公司联手打造的国内顶尖量化交易平台,内置强大的下单工具、和程序化交易功能。满足您多品种、多周期等交易需求。
960 0
证券量化交易平台-接入业务:SpringBoot 集成Apama
阿里云域名代续费及域名查找阿里云账号的方法
域名续费只有原注册人可以续费吗?阿里云域名支持代续费功能,通过域名也可以查找忘记的阿里云账号
1561 0
阿里云域名代续费及域名查找阿里云账号的方法
|
自然语言处理 iOS开发 UED
FL Studio20中文版永久升级教程
FL Studio中文版来啦!!!为了国内音乐创作者服务,免去安装后需要调整语言的麻烦,FL Studio特意为大家带来了中文版的FL Studio,安装后软件自动是中文,中文版顾名思义就是只支持中文版。
826 0
|
存储 缓存 JavaScript
浏览器禁止缓存讲解
浏览器禁止缓存讲解
620 0
浏览器禁止缓存讲解