ASP.NET核心系列的模型绑定和验证方法
一、模型绑定
ASP.NET核心MVC中的模型绑定将HTTP请求中的数据映射到动作方法参数。这些参数可以是简单类型参数,如字符串、整数或浮点数,也可以是复杂类型参数。当MVC收到一个HTTP请求时,它会将请求路由到控制器的指定动作方法。默认路由模板是{ controller=home }/{ action=index }/{ id?}
//例如,请求URLhttp://contoso.com/movies/edit/2//maps进行电影/编辑/2公共交互结果编辑(int?Id)上面的Url请求对应于movies控制器下的Edit方法,该方法接受一个名为id的可选参数。MVC将“编辑”中的id参数绑定到路由值中同名的值。网址路由中的字符串不区分大小写。
上例中绑定的参数是简单类型。如果参数是一个类,比如Movie类型,它包含简单和复杂的类型作为属性,MVC的模型绑定仍然可以很好地处理它。它使用反射和递归来遍历复杂类型的属性(如集合和字典)。
如果模型绑定失败,MVC不会引发错误,参数值为空。如果HTTP请求中的数据是用户输入的值,则应该使用ModelState进行检查。操作中的IsValid属性,无需手动检查。
注意:要实现模型绑定,类必须有一个公共默认构造函数和一个公共可写属性来绑定。发生模型绑定时,只能在使用公共默认构造函数实例化类后设置属性。
模型绑定完成后,将进行模型验证。对于大多数开发方案来说,默认模型的绑定效果是极好的。也可以扩展。如果有特殊需求,可定制的内置行为包括:模型绑定特性、全局自定义模型绑定和验证、绑定请求体中的格式化数据(JSON、XML等多种格式)、高级部分的自定义模型绑定。这里不解释,请查看文档。
二.模型验证
在数据库中存储数据之前,应用程序必须验证数据。在MVC中,身份验证发生在客户端和服务器端。
2.1验证属性
验证属性是模型验证的一种方法,在概念上类似于数据库表中字段的验证。验证属性是在属性级别指定的。以下是一个例子:
公共类Movie { public int Id { get设置;}[必选][字符串长度(100)]公共字符串标题{ get设置;}[古典电影(1960)][数据类型(DataType。Date)])公共DateTime ReleaseDate { get设置;}[必需][字符串长度(1000)]公共字符串描述{ get设置;}[范围(0,999.99)]公共十进制价格{ get设置;}[必需]公共流派流派{ get设置;} public bool Preorder { get设置;常用的内置身份验证属性包括:【信用卡】信用卡格式、【比较】匹配两个属性、【EmailAddress】邮件格式、【Phone】电话格式、【Range】给定范围内、【RegularExpression】正则表达式、【Required】必需属性值、【StringLength】最大长度、【Url】Url格式,还可能包括自定义身份验证属性(如ClassicMovie)。所有内置认证属性均参考官网
2.2自定义身份验证
以上验证属性适用于大多数验证需求。但是,有些验证规则是特定于您的业务的。在MVC中创建自定义验证属性很简单。只需从ValidationAttribute继承并重写IsValid方法。IsValid方法采用两个参数,第一个是名为value的对象,第二个是名为ValidationContext的validationContext对象。值是指要由自定义验证程序验证的字段中的实际值。
///摘要///自定义验证////摘要公共类classic movieattribute :验证属性{ private int _ year///摘要///验证规则值////summary///param name=' year '/param public classificationmovieattribute(int year){ _ year=year;}受保护的覆盖验证结果无效(对象值,验证上下文验证上下文){电影电影=(电影)验证上下文ObjectInstance//用户不能将1960 年以后发行的电影的流派设置为经典如果(电影。类型=='经典'电影发布日期。年份)返回新的验证结果(GetErrorMessage());}返回验证结果。成功;}私有字符串GetErrorMessage() { return $ '经典电影的发行年份必须早于{ _年} .} }运行程序,发布日期是1989年流派是经典,点击保存,验证是在服务端进行,显示错误消息,没有经过前端射流研究…验证,如下所示:
2.3 客户端射流研究…验证介绍
框架非介入式验证脚本是一个自定义微软前端库,建立在流行的框架验证插件。客户端验证原理是:MVC的标记帮助程序和超文本标记语言帮助程序则能够使用模型属性中的验证特性和类型元数据,呈现需要验证的表单元素中的HTML 5数据-属性MVC。为内置模型属性和自定义模型属性生成资料属性。然后,jQuery非介入式验证分析资料属性并将逻辑传递给框架验证,从而将服务器端验证逻辑有效地"复制"到客户端。可以使用相关标记帮助程序在客户端上显示验证错误。
下面示例表单中,asp-标记帮助程序代码如下:
div class=' form-group '标签ASP-for=' release date ' class=' control-label '/labelinput ASP-for=' release date ' class=' form-control '/span ASP-validation-for=' release date ' class=' text-danger '/span/div标记帮助程序将生成以下源html。请注意,HTML输出中的资料属性与发布日期属性的验证特性相对应。下面的数据值-必需属性包含在用户未填写发行日期字段时将显示的错误消息jQuery。非介入式验证将此值传递给需要框架验证()方法,该方法随后在随附的跨度元素中显示该错误消息。
form action='/Movies/Create '方法=' post ' div class=' form-horizontal ' H4电影/H4 div class=' text-danger '/div div class=' form-group ' label class=' col-MD-2 control-label ' for=' release date '发行日期/label div class=' col-MD-10 ' input class=' form-control ' type=' datetime ' data-val=' true ' data-val-required='发行日期字段是必需的id=“发布日期”名称=“发布时间” 日期'值=' '/span class=' text-危险字段-验证-valmsg-for='发布日期'数据-valmsg-replace=' true '/span/div/div/form 2.4动态表单添加验证
在创建动态表单后,需要立即对其进行分析。例如,下面的代码展示如何对通过创建交互式、快速动态网页应用的网页开发技术添加的表单设置客户端验证。
$.get({ URL : ' https://URL/that/a/form ',dataType: 'html ',error:函数(jqXHR,textStatus,错误通过){ alert(textStatus ' :无法添加表单错误通过);},成功:函数(newFormHTML) { //添加表单newFormHTML var容器=文档。getelementbyid(' form-container ');集装箱。insertadjacenthtml(' end前',newFormHTML);//验证第一个表单var forms=容器。getelementsbytagname(' form ');var new FORm=FORms[FORms。长度-1];//分析表单的资料属性$ .验证器。独立。解析(新形式);} })$ .验证器。intrupt。解析()方法分析该选择器内表单的资料属性。当用户填写表单中的属性值提交时,这些属性的值传递到框架验证插件中,以便表单展示所需的客户端验证规则。
下面用一个简单示例来说明:
(1)创建动态表单验证。射流研究…文件,模拟动态生成表单,以及点击(#idbtn)按钮时验证:
var new form HTMl=' form action=\ ' create '方法=\ ' post \newformHTMl=' div class=\ ' form-group \ ';newFormHTML=' label ASP-for=\ ' Title ' class=\ ' control-label \ '/label ';newFormHTML='输入类型=\ '文本'数据-值=\ '真'数据-值-必需=\ '标题字段是必需的' id=\ ' Title \ ' name=\ ' Title \新表单HTMl=' span class=\ ' text-危险字段-验证-val msg-for=\ ' Title ' data-val msg-replace=\ ' true \ '/span ';新表单HTMl='/div ';newformHTMl=' div class=\ ' form-group \ ';newFormHTML='输入类型=\ '提交'值=\ '保存'类=\ ' BTN BTN-小学\ '/';新表单HTMl='/div ';新表单HTMl='/form ';$('#idbtn ').单击(函数(){ var container=document。getelementbyid(' form-container ');集装箱。insertadjacenthtml(' end前',newFormHTML);var forms=容器。getelementsbytagname(' form ');var new FORm=FORms[FORms。长度-1];//分析表单的资料属性$ .验证器。独立。解析(新形式);});(2) 新建创造页
@model StudyMVCDemo .模型。电影@{视图数据['标题']='创建;}h1Create/h1div class='row '输入值='动态加载表单type=' button ' id=' idbtn '/div id=' form-container ' class=' col-MD-4 '/div/div a ASP-action=' Index '返回到List/a/div @ section Scripts { @ { wait Html .RenderPartialAsync(' _ validationscriptpartial ');}脚本src=' http : ~/js/dynamic-form-validate。js '/script }运行程序,点击'动态加载表单' 调用射流研究…将超文本标记语言表单添加到表单容器元素容器中,点击救援提示该字段不能为空,效果如下所示:
2.5 动态控件添加验证
当向表单动态添加控件(比如:输入/和选择/)时,需要更新表单上的验证规则。做法是应当先删除现有的验证数据,然后重新分析整个表单,如下射流研究…代码所示:
$.get({ URL : ' https://URL/that/a/control ',dataType: 'html ',error:函数(jqXHR,textStatus,错误通过){ alert(textStatus ' :无法添加控件错误通过);},成功:函数(new input thttml){//向表单动态添加投入控件var form=文档。getelementbyid(' my-form ');形式。insertadjacenthtml(' end前',new inputhtml);//移除现有的验证$(表单)。移除数据("验证器")//由框架验证添加移除数据(”不引人注目的验证");//由框架非介入验证添加/重新分析整个表单$ .验证器。独立。解析(表单);}})2.6 IClientModelValidator
在上面2.2自定义验证中,继承了ValidationAttribute进行服务端验证,还可以结合实现IClientModelValidator接口实现客户端验证,该接口用来控制要添加哪些资料属性。实现接口如下所示:
///摘要///自定义验证////摘要公共类经典movieattribute :验证属性,IClientModelValidator { private int _ year;///摘要///年份参考值////summary///param name=' year '/param public classificationmovieattribute(int year){ _ year=year;}受保护的覆盖验证结果无效(对象值,验证上下文验证上下文){电影电影=(电影)验证上下文ObjectInstance//用户不能将1960 年以后发行的电影的流派设置为经典如果(电影。类型=='经典'电影发布日期。年份)返回新的验证结果(GetErrorMessage());}返回验证结果。成功;}私有字符串GetErrorMessage() { return $ '经典电影的发行年份必须早于{ _年} .} public void AddValidation(client modevalidation context){ if(context==null)}抛出新的ArgumentNullException(上下文的名称));} MergeAttribute(上下文。属性、“数据值”、“真”);MergeAttribute(上下文。属性,' data-val-classic movie ',GetErrorMessage());定义变量年=_年ToString(CultureInfo .不变量文化);MergeAttribute(上下文。属性,'数据价值-经典电影年',年份);}私有bool MergeAttribute(IDictionAryString,字符串属性,字符串键,字符串值){ if(属性).contains KeY(key)){ 0返回false}属性。添加(键、值);返回真;} }生成的源超文本标记语言代码如下所示:
输入类='窗体-控件'类型='日期'数据-val='真'数据-val-经典电影='经典电影必须早于1960年发行一年数据-val-经典电影-年份=' 1960 '数据-val-必填='发布日期字段为必填项id='ReleaseDate '名称='ReleaseDate '值='1989-02-12 '在上面虽然实现了IClientModelValidator接口,但框架不了解规则或消息,还需要自定义古典电影客户端验证方法,添加到框架验证器对象。脚本如下所示:
//添加验证方法$ .验证器。addmethod('经典电影',函数(值,元素,参数){//值,是当前验证的元素的值//元素。元素本身//参数是传入的参数(期权.规则)风险值流派=$('#form1 ').查找(' #流派')。val(),年份=参数[0],日期=新日期(值);如果(温柔。长度0温柔==='经典'){//由于这是一部经典电影,如果上映日期在给定年份之后,则无效返回日期。get full year()=year;}返回true });//注册一个适配器,参数一是适配器名称,参数2是验证规则的名称$ .验证器。独立。适配器。添加('经典电影',['年'],函数(选项){ //适配器规则绑定到框架验证上面选项。规则['经典电影']=[ParSeint(选项。params[' year '])];选项。消息['经典电影']=选项。消息;});运行程序,发布日期是1989年流派是经典,点击保存,客户端验证返回假的,提示错误信息,如下所示:
参考文献
模型绑定
模型验证
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
版权声明:ASP.NET核心系列的模型绑定和验证方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。