mvc html validator,ASP.NET MVC实现Validation验证器扩展

今天介绍在ASP.NET MVC实现Validation验证器扩展,通过使用Controller验证并不是最好的方法:验证过于分散,容易造成重复代码,不利于维护与扩展,因此本节将使用MVC默认绑定器(DefaultModelBinder)中包含了验证架构,并实现Validation验证器扩展,请看下文:

MVC中可直接在控制器Action方法中进行验证:检查传入参数,如果传入参数不符合业务规则,则通过控制器的ModelState属性的AddModelError方法向模型状态添加错误消息,通过ModelState.IsValid判断模型是否全部通过验证,随后,在视图中通过Html.ValidationSummary、Html.ValidationMessage、Html.ValidationMessageFor辅助方法生成验证消息。

验证应该是和模型紧密相关的,如果我们将模型独立为一个单独的程序集,那么验证也应该包含在模型的程序集中。从用户录入的数据到具体的模型,这个映射过程就是模型绑定,所以在绑定过程中实现验证是一个不错的选择,这也是MVC中最重要的验证方式。

MVC默认绑定器(DefaultModelBinder)中包含了验证架构,具体来说,默认绑定器在将值提供器的数据填充到模型的时候,遵循以下流程:调用默认绑定器的OnModelUpdating方法—>从值提供器获取值并填充到模型—>调用默认绑定器的OnModelUpdated方法。DefaultModelBinder类中OnModelUpdating方法始终返回true,即默认绑定器在填充模型之前没有验证,在填充数据后,OnModelUpdated中实现相应的验证。默认绑定器中验证体系类关系图如下:

fb0a774681fd62e3cb953dc7be35af32.png

模型绑定中的验证体系包含三个主要类:

验证器提供者:ModelValidatorProvider,用于产生验证器

验证器:ModelValidator,用于实现具体的验证逻辑,其中GetClientValidationRules用于返回客户端验证脚本使用的验证规则(ModelClientValidationRule),Validate方法用于实现服务端的验证逻辑。

特性:通常由提供者使用,根据特性指定的规则产生相应的验证器

ModelValidatorProviders是一个静态类,他包含一个用于保存MVC中默认验证器提供者的集合(静态属性Proviers),MVC在填充完模型数据之后,依次对每一个模型属性,从Providers中获取所有的针对该属性的验证器,然后调用验证器上的Validate方法产生验证结果(ModelValidationResult),绑定器根据该结果数据向ModelState中添加验证消息。

MVC中实现了三个默认的验证器提供者(相应产生三个验证器):

DataAnnotationsModelValidatorProvider: 用于实现.NET中的验证特性,即System.ComponentModel.DataAnnotations命名空间下的多种验证特性,包含用于限制属性区间的RangeAttribute,用于验证数据是否符合正则表达式的RegularExpressionAttribute,用于指定必需项的RequiredAttribute,用于限制字符串长度的StringLengthAttribute,DataAnnotationsModelValidatorProvider通过桥接模式,将.NET的验证特性转换为ModelValidator,所以我们可以直接在MVC中使用.NET验证特性来实现验证。

DataErrorInfoClassModelValidatorProvider: 此提供器主要是为了向后兼容,用于实现基于IDataErrorInfo接口的验证方式(MVC 1.0),即你可以为模型实现IDataErrorInfo接口,这样默认绑定器同样可以通过该接口来调用你的验证逻辑。

ClientDataTypeModelValidatorProvider: 此提供器只用于客户端对数值型数据的验证(产生相应的客户端验证脚本),他的Validate方法不会返回任何验证结果。

MVC中另外实现了一个抽象类:AssociatedValidatorProvider,它从ModelValidatorProvider继承,并重写了GetValidator方法,增加传入了附加在模型属性上的特性集合。所以,如果我们需要实现基于特性的验证方式,则应该从此类继承实现自己的验证器及相应的提供者类。当然我们也可以使用默认的DataAnnotationsModelValidatorProvider,这样我们只需要从ValidationAttribute特性继承,并实现自己的验证逻辑。

客户端验证

ModelValidator中GetClientValidationRules方法可以返回用于客户端的验证规则,这些规则可以在客户端脚本中访问,客户端脚本根据这些验证规则检查用户录入资料,并将验证结果反馈给用户。

下例将实现一个ConfirmValidator,用于验证用户注册时两次密码必须输入一致:

1、创建一个空MVC项目

2、添加用户信息模型UserInfo.cs

显示行号 复制代码 ?UserInfo

public classUserInfo

{

public stringUserName { get; set; }

public stringPassword { get; set; }

public stringConfirmPassword { get; set; }

public stringEmail { get; set; }

}

3、创建一个特性,用于指定与属性关联的另一个属性的名称

显示行号 复制代码 ?ConfirmValidatorAttribute

public classConfirmValidatorAttribute: Attribute

{

publicStringConfirmPropertyName { get; set; }

publicConfirmValidatorAttribute(stringname)

{

ConfirmPropertyName = name;

}

}

4、创建用于实现验证逻辑的ConfirmValidator类

显示行号 复制代码 ?ConfirmValidator

public classConfirmValidator: ModelValidator

{

private stringconfirmPropertyName;

publicConfirmValidator(ModelMetadatametaData, ControllerContextcontext, stringconfirmProperty)

: base(metaData, context)

{

confirmPropertyName = confirmProperty;

}

public overrideIEnumerable Validate(objectcontainer)

{

if(container == null)

yield break;

PropertyInfopi = container.GetType().GetProperty(confirmPropertyName);

if(pi != null)

{

stringconfirmValue = (string)pi.GetValue(container, null);

if( !(Metadata.Model??String.Empty).Equals(confirmValue??String.Empty))

{

yield return newModelValidationResult()

{

Message = "两次输入不一致!"

};

}

}

else

{

throw newInvalidOperationException("属性"+ confirmPropertyName + "不存在");

}

}

}

5、创建用于产生ConfirmValidator的提供者类:ConfirmValidatorProvider

显示行号 复制代码 ?ConfirmValidatorProvider

public classConfirmValidatorProvider: AssociatedValidatorProvider

{

protected overrideIEnumerable GetValidators(ModelMetadatametadata, ControllerContextcontext, IEnumerable attributes)

{

foreach(ConfirmValidatorAttributeattr inattributes.OfType())

{

yield return newConfirmValidator(metadata, context, attr.ConfirmPropertyName);

}

}

}

6、创建用于测试的控制器及视图

显示行号 复制代码 ?HomeController

public classHomeController: Controller

{

publicActionResultIndex()

{

returnView(newUserInfo());

}

[HttpPost]

publicActionResultIndex(UserInfoui)

{

returnView(ui);

}

}

x) %>

7、修改UserInfo.cs,在ConfirmPassword属性上添加ConfirmValidator特性。

[ConfirmValidator("Password")]

public stringConfirmPassword { get; set; }

8、在Global Application_Start中添加ConfirmValidatorProvider

ModelValidatorProviders.Providers.Add(newConfirmValidatorProvider());

实现客户端验证:

1、修改ConfirmValidator类,添加GetClientValidationRules方法。

public overrideIEnumerable GetClientValidationRules()

{

ModelClientValidationRulerule = newModelClientValidationRule()

{

ErrorMessage = "两次输入不一致!",

ValidationType = "ConfirmValidator"

};

rule.ValidationParameters["ConfirmPropertyName"] = confirmPropertyName;

yield returnrule;

}

2、修改Index.aspx,添加对Ajax脚本的引用

3、添加自定义验证脚本

Sys.Mvc.ValidatorRegistry.validators.ConfirmValidator = function (rule) {

var propertyName = rule.ValidationParameters.ConfirmPropertyName;

return function (value, context) {

var confirmValue =document.getElementsByName(propertyName)[0].value;

return (value == confirmValue);

}

};

4、开启客户端验证功能

5、将ConfirmPassword属性加入客户端验证

x.ConfirmPassword); %>

修改后完整视图代码:

x.ConfirmPassword); %>

x) %>

Sys.Mvc.ValidatorRegistry.validators.ConfirmValidator = function(rule) {

varpropertyName = rule.ValidationParameters.ConfirmPropertyName;

return function(value, context) {

varconfirmValue = document.getElementsByName(propertyName)[0].value;

return(value == confirmValue);

}

};

d331f804cf73bdde78a59c48cfaf0d66.png

验证用于保证用户输入的正确性,及时阻止用户提交错误数据,确保数据符合业务规则。为此实现自定义扩展的验证,其实也是一件相当必要的事情。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自定义列表视图

通过继承BaseAdapter写一个子类,可以创建自定义列表视图: public class MyListAdapter extends BaseAdapter { private LayoutInflater mInflater;//声明一个LayoutInflater类变量 private Context mContext;//声明一个Context类变量 priva…

springmvc请求返回一个字符_SpringMVC系列之Web利器SpringMVC

课程简介:课程目标:了解SpringMVC和Spring的关系,能够使用SpringMVC框架开发自己的Web应用。整合Spring , SpringMVC , MyBatis搭建项目开发环境,理解三层架构和MVC模式适用人群:适合对Java基础知识应用自如&#xff0…

一次完整较为渗透过程

步骤一: 利用阿D浏览器通过https://s.bt.gg 注入关键字扫描发现注入点: http://www.rqyl.gov.cn/*****.php?ID153 用啊D跑不出账号密码 步骤二: 手工注入http://www.rqyl.gov.cn/*****.php?ID153 and 11 、and12出错 猜字段ht…

计算机网络线路争用,计算机网络系统集成复习要点

计算机网络系统集成复习要点计算机网络系统集成复习要点1.在信息领域,对于系统集成一般分为软件集成、硬件集成和网络系统集成。2.按网络覆盖范围的大小,将计算机网络分为局域网(LAN)、城域网(MAN)、广域网(WAN)和互联网。3. 计算机网络拓扑结构是指一个…

v380pro设备连接失败_天猫精灵可以连接台式电脑使用吗?需要什么东西? 安装操作是哪几个步骤? 最好有图片解说!...

使用语音将天猫精灵调到【蓝牙配对】;打开电脑的蓝牙适配界面,让电脑找到天猫精灵,稍等片刻,点击【使用远程装置的扬声器聆听来自此PC的音频】后的连接;最后调整音量即可。以下是详细介绍:1、对天猫精灵说【…

IDE-Ecplise-代码注释 模版 编码规范 配色

说明: 代码注释主要用于方便代码后期维护,编码规范,增加代码阅读性和维护性。因网上看到的很多博客中片段局多,故整理后重写一篇,方便交流学习。 先看下加过注释模版后的效果。如上图所示,创建类&#xff0…

个人信息管理系统代码_学生信息管理系统(springboot + vue)

学生信息管理系统零、基础项目为前后分离项目1、前端(front-end)基于 vue-admin-template 开发2、后端(rear-end)Jdk8Maven3MySQL5.7SpringBoot2SQLYog一、功能模块图图片.png二、系统预览1、登录登录.png2、首页首页.png3、查看学生信息查看学生信息.png4、编辑学生信息编辑学…

苹果手机6s运营商在哪里显示无服务器,iPhone6s信号很弱或无服务如何解决【解决方法】...

很多果粉都遇到过自己的手机常常“无服务”或者信号很弱的情况。 iphone6s 信号很弱或无服务怎么办?iPhone手机信号不好的原因有很多,排除SIM卡,手机本身硬件故障等问题,你可以尝试以下方法“修复”你的手机信号问题。1、开关飞行…

72年属鼠48岁有一灾2020_李半仙推算:1972年虚岁48岁属鼠人,2020年干什么最能发财??...

李半仙推算:1972年虚岁48岁属鼠人,2020年干什么最能发财??生肖属鼠的朋友,在未来,喜事接二连三,属鼠人能够得到财神赐福,一路大发特发,很快就会有发财致富的商机,加上属鼠…

vue怎么插入接口demo_前端学起来特别吃力,新人入前端怎么学?

最近知乎收到一些问题,问前端学起来吃力,连续更新几次回答的比较全了。现在整理下分享给掘金的小伙伴们。原知乎问题:前言前端工作两年多。大部分前端原理、框架都能完全运用。工作中几乎遇不到解决不了的问题(除了那些恶心无法实现的需求&am…

w7怎么重启无限服务器,w7重启数据库服务器

w7重启数据库服务器 内容精选换一换WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上搭建属于自己的网站,本文教您通过华为云虚拟私有云、弹性云服务器和RDS MySQL数据库,轻松几步,在LAMP环境下搭…

顺德机器人应用与维修专业收入_保定万维科技技校专业课程巡礼——计算机应用与维修...

保定万维科技技工学校院校简介 / 专业设置 / 招生简章资助政策 / 在线报名点击上方蓝色字体【保定万维科技技工学校】关注我们专业简介:本专业培养适应企事业单位发展、应用的需要,具有扎实的计算机基础知识、计算机专业知识和较强的计算机办公自动化、数…

PC和服务器的IP地址信息DNS,PC和服务器的IP地址信息DNS

PC和服务器的IP地址信息DNS 内容精选换一换网站的访问与云服务器的网络配置、端口通信、防火墙配置、安全组配置等多个环节相关联。任意一个环节出现问题,都会导致网站无法访问。本节操作介绍网站无法访问时的排查思路。网站无法访问怎么办?如果打开网站…

abaqus生成adams柔性体_专栏 | HyperMesh_To_Abaqus接口——模型导入导出问题

作者介绍TechmanLXS硕士十余年工程经验擅长Hypermesh建模,Hyperworks全平台分析软件,abaqus软件。整车级被动安全(ls-dyna、Radioss),零部件级(moldflow模流分析,塑料件联合仿真分析)。熟知汽车车身,内外饰&#xff0c…

knockoutJS学习笔记01:从拼接字符串到编写模板引擎

开篇 关于knockout的文章,园里已经有很多大神写过了,而且都写得很好。其实knockout学习起来还是很容易的,看看官网的demo和园里的文章,练习练习就可以上手了(仅限使用,不包含研究源码)。之所以想…

新乡台达服务器驱动器维修,台达DELTA伺服驱动器维修

与数控装置的接口电路无关。检查测量系统电缆连接正确、可靠,排除了电缆连接的问题。利用示波器检查位置测量系统的前置放大器EXE601/5-F的Ual和Ua*Ua1和Ua2输出波形,发现Ua1相无输出。进一步检查光栅输出(前置放大器EXE601/5-F的输入)信号波形&#xff…

60度斜坡怎么计算_【测绘】南方CASS土方计算方法—方格网法

01概述在我们的日常工作中,遇到大量的土方修正算的相关咨询,为什么CASS的方格网土方修正算,方格设定为10米和20米,修正算结果有很大差异呢?从软件计算原理、数据质量等方面进行分析,读了这篇文章&#xff0…

综合时如何插入scan_三综合环境试验箱维修时如何做出正确判断?

三综合环境试验箱维修时如何做出正确判断?三综合环境试验箱在试验的过程中,可以根据需要设定不同的温度情况,以便于为各种测试要求提供便利的条件。在测试一些材料结构或复合材料的时候,主要是利用其在瞬间高温情况或者是在极低温的连续环境…

mysql 判断字段为null表示 false 其它为true_日拱一卒,MySQL数据库 常用SQL优化技巧 十一式...

本文中所提到的SQL优化技巧均是基于Mysql 索引 BTree类型 。将从以下几个方面介绍常用的SQL优化技巧&#xff1a;避免在 WHERE 子句中使用 ! 或 <> 操作符。避免在 WHERE 子句中对索引列使用 %前缀模糊查询。避免在 WHERE 子句中对索引列使用 OR 来连接条件。避免在 WHER…

数字图像处理

题目&#xff1a;大规模图像中的目标检测与分类方法 在进行图像目标识别与跟踪时&#xff0c;摄像机所采集的图像&#xff0c;在成像、数字化以及传输过程中&#xff0c;难免会受到各种各样噪声的干扰&#xff0c;图像的质量往往会出现不尽人意的退化&#xff0c;影响了图像的视…