宏观上理解blazor中的表单验证

这篇具有很好参考价值的文章主要介绍了宏观上理解blazor中的表单验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

表单验证的最终效果大家都懂,这里不阐述了,主要从宏观角度说说blazor中表单验证框架涉及到的类,以及它们是如何协作的,看完这个,再看官方文档也许能更轻松点。

blazor中的验证框架分为两部分:基础验证框架 和 基于数据注释Atrrbute的验证器,当然也提供了很多扩展点。注意我们通常使用数据注释Atrrbute的验证器,但它仅仅是在基础验证框架上扩展而来的,并不是核心,我们下面先分析基础验证框架,后续再说基于数据注释的验证。

表单验证是围绕表单,往往一个表单绑定到一个对象,我这里称为编辑模型,表单中的输入框与这个对象属性绑定。

我们先把基础验证框架看作一个整体,从几个角度分析:

 

  1. 产生验证消息,这个不属于验证框架的核心部分,验证框架只需要提供一个方法,当框架外部产生验证时,调用此方法,让验证框架去记录即可
  2. 存储验证消息是验证框架的核心工作之一,我们可以想象使用一个Dictionary<字段,List<验证消息>>来存储,key对应编辑模型的一个字段,value是验证消息集合,一个字段可能有多个验证消息。
  3. 我们可以定义两个组件用于展示验证消息,一个用于汇总展示,一个用户展示指定指定的验证消息,它们从验证框架获取验证信息进行显示。
  4. 清空验证消息,验证框架内部从存储中清空即可,可以向外暴露个事件,还可以留个方法允许外部主动调用清空验证消息,最好再允许外部清空指定字段的验证消息。
  5.  下面说明下blazor中表单验证的关键类,以及它们之间的关系。

基础验证框架先是定义几个零散的类,各自负责处理自己的部分,然后通过引用、方法调用把几个类串联起来。

字段标识FieldIdentifier

前面说存储验证消息时,类似这么个类型:Dictionary<字段,List<验证消息>>,简单的情况“字段”可以用个string类型,但我们是在内存中,可以用更直接的方式。

FieldIdentifier = 编辑模型的引用 + 字段名,它就代表编辑模型的某个字段。后续我们要操作某个字段,往往都是用这个参数。

验证消息存储器ValidationMessageStore

ValidationMessageStore是用这样一个字段Dictionary<FieldIdentifier, List<string>> _messages来存储验证消息的。key是字段,value是此字段的多个验证消息。也提供了插入、删除等验证消息等方法。

它一般是有我们自己的代码new出来的,或者有扩展的验证器,如 基于数据注释的验证器new出来的。new它的时候会把editContext对象传进来,后面会用。

当调用这个对象添加验证消息时,它会存储此字段的验证消息,并且调用editContext获取字段状态FieldState,将自身的引用传递给它,以便FieldState将来反向通过存储器来查询验证状态。

字段状态FieldState

FieldState表示字段的状态,所谓的状态就是 这个字段是否修改过、以及获取它关联的验证消息(本质上是从ValidationMessageStore获取,后面会说)。

为啥不跟字段标识FieldIdentifier合并为一个类呢?
字段标识只是代表某个字段,在很多方法参数时都会用到,它比较轻量;而字段状态是存储了字段是否修改和验证消息列表的,相对来说比较重,那些方法可能仅仅是想通过字段标识做查找,并不关心内部的状态

它包含一个ValidationMessageStore的列表,获取此字段的验证消息时,就是遍历这个列表获取的。但FieldState不负责向存储器添加验证消息。这个列表如何来的,验证消息存储器ValidationMessageStore已经说明了。

表单编辑上下文EditContext

可以把EditContext理解为 :字段状态FieldState列表 + 编辑模型实例,注意它不引用ValidationMessageStore,之所以这样设计是想保持EditContext轻量。

那主要关心的就是FieldState列表的crud操作
创建FieldState,则是外部想通过EditContext获取字段状态时,若有就返回,否则创建并记录下来。
读取就直接遍历FieldState咯。
删除:好像木有,也没有必要
改:找到字段状态,直接改咯。

另外:一个EditForm与一个EditContext关联,EditForm内部的组件会通过级联方式获得editContext的引用

额外的,它还提供字段变化时、请求验证时的相关事件。

小结

  1. 保持EditContext轻量,它不引用具体的验证存储器,而是只包含 字段状态 + 编辑模型实例,通过EditContext遍历里面的字段状态FieldState,获取验证消息,字段状态内部是遍历存储器列表获取验证消息。
  2. 将验证状态存储器抽离出来,哪里想向编辑上下文添加字段验证,就new ValidationMessageStore(editContext);然后Add验证消息即可。
  3. 便于扩展,比如后面的基于数据注解的验证器,它就是自己new ValidationMessageStore(editContext),然后使用注解验证方式向其添加验证。

验证消息的展示

展示就比较简单了,EditForm与EditContext关联的,它会级联传递到表单的子组件,子组件通过EditContext遍历字段就能拿到验证消息。

ValidationSummary

它是汇总显示所有验证消息,它通过级联参数获取EditContext引用,遍历然后显示验证消息。

ValidationMessage

原理类似,它显示指定字段的验证消息。

基于数据注释验证器扩展

所谓的验证器,无非是定义一个类,让它持有EditContext的引用,然后它内部new ValidationMessageStore(editContext),然后通过自己的方式验证后,Add验证消息到ValidationMessageStore即可。

DataAnnotationsValidator

组件是个空壳,它通过级联参数拿到EditContext对象,然后调用EditContextDataAnnotationsExtensions中定义的扩展方法,创建了一个实现IDispose的对象,组件释放时会释放这个对象

这个核心对象内部new ValidationMessageStore(editContext),用来存储验证消息。

它在初始化时会注册:

_editContext.OnFieldChanged += OnFieldChanged;
_editContext.OnValidationRequested += OnValidationRequested;

字段变化时,验证,或者外部向editContext请求验证时,触发验证。然后将验证消息Add到存储器中。文章来源地址https://www.toymoban.com/news/detail-712140.html

到了这里,关于宏观上理解blazor中的表单验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3使用el-form实现登录、注册功能,且进行表单验证(Element Plus中的el-form)

    简介:Element Plus 中的 el-form 是一个表单组件,用于快速构建表单并进行数据校验。它提供了丰富的表单元素和验证规则,使表单开发变得更加简单和高效。可以搭配el-dialog实现当前页面的登录、注册页 ,这两天在vue3中用到了表单登录,特意记录一下,这里没有封装,直接使

    2024年02月07日
    浏览(73)
  • elementUI表单验证之动态表单验证

    elementUI 中 Form 组件提供了表单验证的功能,只需要通过  rules  属性传入约定的验证规则,并将 Form-Item 的  prop  属性设置为需校验的字段名即可。 (1)常用表单验证 (2)自定义验证规则(:validator)  有些需要自定义的校验规则可以作为变量写在data中,然后赋值

    2024年02月11日
    浏览(53)
  • 表单验证 ---- 在Vue2中使用ElementUI进行表单验证

    目录 前言 给表单绑定对应属性 在data中定义数据对象和表单的定义规则 与数据对象双向绑定 对整个表单进行验证 在做项目时,对于表单进行验证是我们必不可少的 例如 搭建一个基本的登录界面 表单嵌套一般都是   el-form el-form-item el-input  进行验证前,我们需要先 对el-

    2024年01月20日
    浏览(42)
  • 【vue】element-ui的form数组表单验证(循环表单验证)

    基于 vue2.0 的 element-ui 的 form 表单验证比较简单,但是有些同学可能对于 数组类型 的表单验证无从下手,这里我基于一个我自己项目中的例子,展示一下怎么进行数组的表单验证。 项目截图: 上代码,为了让大家看起来比较清晰,我删掉了无关的代码: 咱们把数组验证的部

    2024年02月07日
    浏览(55)
  • Elenment UI表单验证时,有值但还是提示错误,表单验证失效问题

    下午在用Element UI写一个表单的时候突然发现,表单的验证规则失效了 使用Element自带的表单校验规则时,表单为空的时候下方有提示信息,表单不为空的时候依然有提示信息   查看资料找到几种方式都不管用 一种是检查 el-form-item 中的 prop值 和 el-input 的v-model的值是否一致,

    2024年02月11日
    浏览(46)
  • element 表单验证 深层验证绑定

    直接上代码 :prop 和prop 都可以,vue2和vue3或者是element、elementplus都可以用 table form:

    2024年02月14日
    浏览(41)
  • 23 - form表单验证 - 图形验证码

    绘制验证码         (1). 安装库文件         (2). 封装 绘制 验证码函数         (3). form.py 增加 表单验证         (4). 视图函数 调用 form对象 传递给前端, 并 实现点击刷新验证码 接口         (5). 前端通过 form对象生成页面 , 点击更新img标签路径,实现 刷新验证码 功能

    2024年02月11日
    浏览(49)
  • 「PHP系列」PHP表单及表单验证详解

    PHP 表单用于收集用户输入的数据,并将这些数据发送到服务器进行处理。在 PHP 中,通常使用 HTML 表单来收集用户输入,然后通过 PHP 脚本处理这些数据。 在上面的示例中,我们创建了一个包含姓名和邮箱字段的表单。表单的 action 属性指定了处理表单数据的 PHP 脚本的路径(

    2024年04月16日
    浏览(48)
  • element ui重置表单和清除表单验证

    resetFields()与clearValidate()的区别 相同点:二者都能移除表单校验 不同点:resetFields()会对整个表单进行重置,将所有的字段重置为初始值 clearValidate() 只会移除表单校验,而且可以只对部分字段进行移除校验 this.$refs[formName].resetFields(); 意思是重置表单到初始值 this.$refs[formName

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包