Asp.Net MVC杂谈之:—步步打造表单验证框架(1)

在Web开发中,表单提交算是一种很常见的从客户端获取数据的方式了,然而,用户的行为永远都是无法预料的,为此,我们在程序中不得已必须对用户输入的数据进行严格效验,在WebForm时代我们常用的手段是验证控件,但是到了Mvc时代,再使用控件变得困难了,因此我们必须找到新的方式来解决这个问题.

在实际使用中,我们可以考虑多种形式来进行这一验证(注:本文目前只研究服务器端验证的情况),最直接的方式莫过于对每个表单值手动用C#代码进行验证了,比如:

if(!Int32.TryParse(Request.Form[“age”], out age)){
    xxxx…
}
If(age < xxx || age > xxx){
    xxxx…
}

然而正如上面看到的一样,这种方式枯燥而繁琐,需要用户对每个字段都要手动效验,或许开发人员的一不小心就会造成系统的漏洞.因此,制造出一个能对这种行为进行自动进行的轮子势在必行,当然,到本文写作的时候为止,国外已经出现了一些Mvc下使用的验证框架,然而天下轮子不怕多,我在此厚颜再造出个,只希望不被冠上山寨之名.

该框架的缔造源自4MVC团队的Infancy项目,去年年底开始这个项目的时候,正是mvc框架加入ModelBinder的时候,当时便想到了通过使用ModelBinder来实现一种服务器端自动验证框架,经过多次修改,该框架慢慢实现了我需要的功能,本系列文章将再次回顾该过程,将该框架的一步步的实现过程加以更细致的重现.

下面正式开始框架的开发,首先我们明确下我们的基本需求:

1.该框架针对简单实体类(POCO)

2.该框架能自动对实体类的属性进行效验

3.该实体能被ModelBinder使用

4.能方便或者自动的执行该效验,并取得效验结果和信息

为了实现上面的目标,我们首先来确定一些需要使用的技术手段:

1.要能访问任意POCO的属性,必然用到反射

2.要能对属性进行限制,可选择使用XML或者Attribute,对程序员来说,Attribute远比XML来的方便和友好,因此选择Attribute

3.实现实体验证方法,可能会使用Command模式,也可能不需要

OK,下面开始我们的实践了,首先我们考虑测试代码,假设我拥有实体Student,Student拥有属性Source,要求Source是int类型,且范围为0-100,那么测试代码的模式应该如下:

Student student = new Student(){
        Source = -1
};
bool validateResult = student.Validate();
Assert.IsFalse(validateResult);

也就是说,我们需要在一个验证方法中对该对象的所有属性进行验证,那么我们考虑对系统各部分的构建,首先我们需要一个RangeAttribute,这个类能包含对属性的验证信息,大致如下:

public class RangeAttribute : Attribute{
    public int Mix{ get; set; } //范围下限
    public int Max{ get; set; } //范围上限
    public string Message{ get; set;} //出错信息

    public RangeAttribute(int min, int max, string message){
    Min = min;
    Max = max;
    Message = message;
}
}

时间: 2024-12-22 21:37:17

Asp.Net MVC杂谈之:—步步打造表单验证框架(1)的相关文章

Asp.Net MVC杂谈之:—步步打造表单验证框架(2)

题外话:为了不再误解,关于造轮子的事情在本篇开头再次重点提出,如果您觉得再造轮子的人是傻瓜,那直接无视我以及我的附带品好了.本文的重点并不是做了一个验证框架,真要如此,直接给出代码不就结了,或者直接来篇如何使用DataAnnotations即可,何必长篇大论来一通,如果认真看了本文就可以知道本文是讲解了如何使用TDD的方法来实现一个验证框架,同时尽可能做到通俗易懂,当然,这并不是说本文造的轮子就没有价值了,别人的总是别人的,验证框架并不是一个很复杂的东西,一个人做出一个完善的也不是什么难事,也许

ASP.NET MVC以ModelValidator为核心的Model验证体系:ModelValidatorProviders

前面篇文章我们分别介绍用真正用于实施Model验证的ModelValidator(<ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator>),以及用于提供ModelValidator的ModelValidatorProvider(<ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidatorProvider>),那么对于ASP.NET MVC的Model验证体系来说,最终是通

ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidatorProvider

在<ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator>中我们介绍了ASP.NET MVC用于Model验证的四种ModelValidator,那么这些ModelValidator是如何被创建的呢?ASP.NET MVC的很多组件(比如ModelBinder和Filter)都采用了基于Provider的提供机制,这篇文章为你讲述这些ModelValidator对应的ModelValidatorProvider. 一.ModelVali

支持ASP.NET MVC、WebFroM的表单验证框架ValidationSuar使用介绍

  这篇文章主要介绍了支持ASP.NET MVC.WebFroM的表单验证框架ValidationSuar使用介绍,本文详细讲解了使用步骤,并给出一个完整Demo下载,需要的朋友可以参考下 1.支持javascript端和后端的双重验证 (前端目前依赖于jquery.validate.js,也可以自已扩展) 2.代码简洁 3.调用方便 4.功能齐全 使用方法: 新建初始化类,将所有需要验证的在该类进行初始化,语法相当简洁并且可以统一管理,写完这个类你的验证就完成了70% 函数介绍: Add 默认

在asp.net mvc 4环境下,使用了bootstrap框架之后,请问如何整合less?

问题描述 在asp.net mvc 4环境下,使用了bootstrap框架之后,请问如何整合less? 在asp.net mvc 4环境下,使用了bootstrap框架之后,请问如何整合less? 解决方案 https://www.zhihu.com/question/37458111/answer/75315700

支持ASP.NET MVC、WebFroM的表单验证框架ValidationSuar使用介绍_实用技巧

1.支持javascript端和后端的双重验证 (前端目前依赖于jquery.validate.js,也可以自已扩展) 2.代码简洁 3.调用方便 4.功能齐全 使用方法: 新建初始化类,将所有需要验证的在该类进行初始化,语法相当简洁并且可以统一管理,写完这个类你的验证就完成了70% 函数介绍: Add 默认类型(邮件.手机.qq等) AddRegex 正则验证 在Add无法满足情部下使用 addFunc 使用js函数进行验证,一般用于业逻辑的验证 ,功能非常强大,可以满足各种验证(注意:add

ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator

旨在为目标Action方法的执行绑定输入参数的Model绑定过程伴随着对Model的验证.借助相应的验证特性,我们可以直接以声明的方式在Model类型上定义验证规则,这些规则将会作为Model元数据的一部分.具体在Model绑定过程中,ModelBinder通过ValueProvider为Model对象的某个属性提供相应属性值之后,会根据定义在基于该属性的Model元数据的验证规则实施验证.ASP.NET MVC的整个Model验证系统以组件ModelValidator为核心,或者说Model对

ASP.NET MVC入门 8、ModelState与数据验证

ViewData有一个ModelState的属性,这是一个类型为ModelStateDictionary的 ModelState类型的字典集合.在进行数据验证的时候这个属性是比较有用的.在 使用Html.ValidationMessage()的时候,就是从ViewData.ModelState中检测是否 有指定的KEY,如果存在,就提示错误信息.例如在前一篇文章ASP.NET MVC 入门 7.Hellper与数据的提交与绑定中使用到的UpdateModel方法: 我们在View中使用Html.

详解ASP.NET MVC 2中的新ADO.NET实体框架

.NET框架4.0的发行推出了许多优秀的增强功能,其中当首推ADO.NET实体框架.该框架已经克服了以前的许多错误,并提供了一组增强的 API,其中包括许多新的LINQ to SQL框架方面的改善.在本文中,我们将使用这些API的功能来创建一个通用版本的数据仓库. 一.实体框架概述 实体框架针对数据模型提供了一些更方便的操作方法.默认情况下,设计器可以生成一个描述数据库的模型. 尽管表格间的映射未必都是1:1的映射.每个表格使用一个ObjectSet加以描述,进而ObjectSet对象又提供了相