最新要闻
- 焦点关注:什么是牙周炎及症状_什么是牙周炎
- SE终于承认《Forspoken》失败:但仍有可取之处
- 世界短讯!广西:全面实现高速服务区充电桩100%全覆盖
- 环球动态:鲜嫩如蛋挞 多鲜岩烧乳酪吐司1斤14.9元
- 世界滚动:Win10极限精简版系统Tiny10更新:加入远程桌面等实用功能
- Intel中国特供i5-13490F闪电降价!这性价比 没治了
- 当前简讯:女子沙漠种树16年让县城免于消失 11年前美国预言翻车
- 每日短讯:掀起汽车降价狂潮之后 湖北再投放5亿元消费券
- 全球讯息:突破142万人!《CS:GO》同时在线数达10年来最高点
- 2.8K OLED高刷屏!华硕灵耀14 2023轻薄本图赏
- 女子试驾比亚迪汉撞树:碗口粗的树都弯了 A柱完好无损
- 环球关注:面向 DevOps 的 Kubernetes 最佳安全实践
- 明明不缺钱 为什么总有人喜欢在家收集垃圾?
- 大众ID.家族新能源汽车跟进降价 最高优惠4万元
- 每日头条!一小时发电量超七万千瓦时!首台国产F级50兆瓦重型燃气轮机下线
- 单机身10499元:佳能入门全画幅微单EOS R8正式上架
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
打开MASA Blazor的正确姿势6:表单验证
【资料图】
对比Blazor内置的表单组件及其验证(EditForm),MASA Blaozr提供了功能更加丰富的表单组件及验证功能,即可以设置字段级验证,也可以设置表单级验证。而其中表单级验证,可以使用DataAnnotations和FluentValidation两种验证方式。
一、字段级验证
1、Rules属性
MASA Blazor所有输入型表单组件,如文本框、单选框、复选框、下拉框、开关、滑块等,都有一个Rules属性。Rules属性的值,是Func
类型的集合,即List
。
- Func委托的参数:类型为字符串,是当前表单组件的输入值。
- Func委托的返回值:类型为StringBoolean,可以返回true、false、或表示错误信息的字符串。返回true,表示验证通过;返回false,表示验证不通过;返回字符串,表示验证不通过,字符串为错误提示信息。
- 验证规则集合:List中每一个
Func
委托,表示一个验证规则,按顺序执行。需要注意的是,MASA Blazor的表单组件,默认每次只显示一条当时触发的错误提示信息,可以通过ErrorCount
设置。
2、字段级验证案例
@code{ private string title = "测试标题"; private string content = "测试内容"; //“标题”的验证规则只有一个 private List> titleRules = new() { v => v.Length <= 20 ? true : "不得超过20个字符" }; //“正文”的验证规则有两个,当输入值发生变化时,按顺序验证,视图层每次只能显示当前触发的错误 private List> contentRules { get { var rules = new List>(); //验证规则1和2 //返回true,表示验证通过;返回字符串,表示验证不通过,且返回错误信息 Func rule1 = (v) => v.Length <= 20 ? true : $"不得超过20个字符"; Func rule2 = (v) => v.Contains("hello") ? true : $"必须包含hello"; //将规则1和规则2加入到规则集合中 rules.Add(rule1); rules.Add(rule2); return rules; } }}
注:案例中未使用MForm组件,但MForm和输入型表单组件的Rules可以一起使用,两者不冲突。
二、表单级验证
1、概述
虽然可以为每个表单组件定义单独的验证规则Rules,但使用还是比较繁琐。大多数情况下,我们主要使用表单级验证。通过MForm组件,以及DataAnnotations或者FluentValidation验证方式,实现更加高效的表单验证。
- MForm组件:MFrom组件相当于HTML原生标签form,或Blazor的内置组件EditForm,作为表单组件的父组件使用。MForm组件属性主要包括:Model-表单绑定及验证的对象,EnableValidation-开启表单验证,Value-是否通过表单验证,EnableI18n-支持检验信息的I18n多语言读取。
- DataAnnotations:AspNetCore内置的模型检验,通过特性方式,标注验证规则,前后端通用。直接引入:
@using System.ComponentModel.DataAnnotations
- FluentValidation:.NET中最常用的第三方验证库,前后端通用。安装nutget包后引用:
@using FluentValidation
2、DataAnnotations验证方式
@using System.ComponentModel.DataAnnotations; 提交
@code{ //表单一般绑定一个Model对象 private Student stu = new Student(); //使用特性标注,为表单绑定的对象设置验证规则 //Model一般使用独立的CS文件,此处仅仅是为了方便举例 class Student { [Required(ErrorMessage ="姓名必填!")] [MaxLength(10,ErrorMessage ="不得超过10个字符!")] public string? Name { get; set; } [Range(0,100,ErrorMessage ="必须介于0至100!")] public int Age { get; set; } [EmailAddress(ErrorMessage ="必须输入Email")] public string? Email { get; set; } } //提交表单,根据验证结果,执行相应逻辑 private void HandleValidSubmit() { Console.WriteLine("验证通过后的执行逻辑"); } private void HandleInvalidSubmit() { Console.WriteLine("验证失败后的执行逻辑"); }}
注:使用DataAnnotations验证方式,操作简便,但使Model与验证耦合。同时,DataAnnotations的验证规则也比较有限。
3、FluentValidation验证方式
@using FluentValidation;
@code{ private Student stu = new Student(); class Student { public string? Name { get; set; } public int Age { get; set; } public string? Email { get; set; } } //为Student类创建一个验证类 //验证类继承AbstractValidator类,在构造函数中为Student类的属性设置验证规则 class StudentValidator : AbstractValidator { public StudentValidator() { RuleFor(s => s.Name).NotEmpty().WithMessage("姓名必填!").MaximumLength(10).WithMessage("不得超过10个字符"); RuleFor(s => s.Age).InclusiveBetween(0, 100).WithMessage("必须介于0至100!"); RuleFor(s => s.Email).EmailAddress().WithMessage("必须输入Email"); } } private void HandleValidSubmit()//...略,和DataAnnotations一样}
注:使用FluentValidation验证方式,稍微繁琐些,但实现了Model类与验证的解耦,且提供了更加丰富的验证规则。
4、验证集合类型
1)DataAnnotations验证方式:
@using System.ComponentModel.DataAnnotations; ...... @foreach (var item in stu.Likes) { } ......
@code { //初始化3个空的爱好项目 private Student stu = new Student() { Likes = new List { new Like{Id = 1}, new Like{Id = 2}, new Like{Id = 3} } }; class Student { [Required(ErrorMessage = "姓名必填!")] [MaxLength(10, ErrorMessage = "不得超过10个字符!")] public string? Name { get; set; } [Range(0, 100, ErrorMessage = "必须介于0至100!")] public int Age { get; set; } [EmailAddress(ErrorMessage = "必须输入Email")] public string? Email { get; set; } //集合使用EnumerableValidation特性标注 [EnumerableValidation] public List Likes { get; set; } } class Like { public int Id{ get; set; } //集合的项目类型,一样使用特性方式标注验证规则 [Required(ErrorMessage = "爱好项目必填!")] public string? LikeItem { get; set; } } ......}
2)FluentValidation验证方式:
@using FluentValidation; ......
@code { //初始化3个空的爱好项目 private Student stu = new Student() { Likes = new List { new Like{Id = 1}, new Like{Id = 2}, new Like{Id = 3} } }; //Model class Student { public string? Name { get; set; } public int Age { get; set; } public string? Email { get; set; } public List? Likes { get; set; } } class Like { public int Id{ get; set; } public string? LikeItem { get; set; } } //验证规则 class StudentValidator : AbstractValidator { public StudentValidator() { RuleFor(s => s.Name).NotEmpty().WithMessage("姓名必填!").MaximumLength(10).WithMessage("不得超过10个字符"); RuleFor(s => s.Age).InclusiveBetween(0, 100).WithMessage("必须介于0至100!"); RuleFor(s => s.Email).EmailAddress().WithMessage("必须输入Email"); //为集合类型的属性设置验证规则 RuleForEach(s => s.Likes).SetValidator(new LikeValidator()); } } class LikeValidator : AbstractValidator { public LikeValidator() { RuleFor(l => l.LikeItem).NotEmpty().WithMessage("爱好项目必填!"); } } ......}
5、表单的验证方式
1)输入型表单组件的输入值变化时,会自动触发验证规则2)使用Type类型为submit的按钮提交时,会触发表单验证(详见上面的所有案例,均使用这种方式)3)通过@ref获取MForm对象,手动验证
@using FluentValidation; 手动验证 重置验证 重置表单
@code { private bool isValidate = true; private MForm form; ...... //通过MForm对象的Validate()方法,手动触发验证 private void Validate() { form.Validate(); } //通过MForm对象的ResetValidation()方法,手动重置验证 private void ResetValidation() { form.ResetValidation(); } //通过MForm对象的Reset()方法,手动重置表单 private void Reset() { form.Reset(); } ......}
6、使用I18n实现验证信息的多语言输出
1)安装I18n
- 在wwwroot目录下新建I18n文件夹
- 在I18n文件夹下分别创建zh-CN.json,en-US.json,supportedCultures.json文件
- 在入口文件Program.cs文件中,注册I18n服务
//zh-CN.json{ "StudentValidateMessage": { "NameRequired": "姓名必填!", "NameLength": "姓名不得超过10个字符", "AgeBetween": "年龄必须介于0至100", "Email": "必须输入Email" }}//en-US.json{ "StudentValidateMessage": { "NameRequired": "Name is Required", "NameLength": "Name must smaller than 10", "AgeBetween": "Age must between 0 and 100", "Email": "Email must be EmailAddress" }}//supportedCultures.json,排第一的项目为默认语言[ "zh-CN", "en-US"]//Program.cs//1、Blazor Server模式,注册I18n服务services.AddMasaBlazor().AddI18nForServer("wwwroot/I18n");//2、Blazor WASM模式,注册I18n服务await builder.Services.AddMasaBlazor().AddI18nForWasmAsync($"{builder.HostEnvironment.BaseAddress}/I18n");
2)通过依赖注入方式,使用I18n
@using FluentValidation;@using BlazorComponent.I18n; ......
@code { private Student stu = new Student(); class Student { public string? Name { get; set; } public int Age { get; set; } } class StudentValidator : AbstractValidator { //注入I18n private readonly I18n i18n; public StudentValidator(I18n i18n) { this.i18n = i18n; //调用I18n的T()方法,读取多语言 RuleFor(s => s.Name).NotEmpty().WithMessage(i18n.T("StudentValidateMessage.NameRequired")); ...... } } ......}
三、输入型表单组件中与验证相关的属性
Rules
:设置验证规则HideDetails
:隐藏提示和验证错误等信息。true/false/auto,当设置为 auto 时,只有在有信息要显示时,才会显示信息。Error
:手动设置验证不通过ErrorCount
:一次性显示错误信息的条数,默认只显示一条ErrorMessages
:手动设置验证不通过的错误信息Success
:手动设置验证通过SuccessMessages
:手动设置验证通过的成功信息ValidateOnBlur
:?ValueExpression
:?
关键词:
-
Codeforces Round #857 Div.1 1801 E F 题解
点我看题1801E Gasolineprices先来看这样一道题:一个长为n的字符串,每个字符都是一个英文小写字母。...
来源: Codeforces Round #857 Div.1 1801 E F 题解
打开MASA Blazor的正确姿势6:表单验证
看点:C#中定义自己的消费队列(下)
焦点关注:什么是牙周炎及症状_什么是牙周炎
SE终于承认《Forspoken》失败:但仍有可取之处
焦点速看:前端设计模式——适配器模式
世界短讯!广西:全面实现高速服务区充电桩100%全覆盖
环球动态:鲜嫩如蛋挞 多鲜岩烧乳酪吐司1斤14.9元
世界滚动:Win10极限精简版系统Tiny10更新:加入远程桌面等实用功能
Intel中国特供i5-13490F闪电降价!这性价比 没治了
计应212小组讨论junit成果
当前简讯:女子沙漠种树16年让县城免于消失 11年前美国预言翻车
每日短讯:掀起汽车降价狂潮之后 湖北再投放5亿元消费券
全球讯息:突破142万人!《CS:GO》同时在线数达10年来最高点
【世界时快讯】ELF 文件
环球快资讯丨表数据量大优化方案设计
2.8K OLED高刷屏!华硕灵耀14 2023轻薄本图赏
女子试驾比亚迪汉撞树:碗口粗的树都弯了 A柱完好无损
环球关注:面向 DevOps 的 Kubernetes 最佳安全实践
焦点速递!9.3.3输入的符号2
明明不缺钱 为什么总有人喜欢在家收集垃圾?
大众ID.家族新能源汽车跟进降价 最高优惠4万元
每日头条!一小时发电量超七万千瓦时!首台国产F级50兆瓦重型燃气轮机下线
Windows10免费激活专业版亲测有效无需安装软件,附:Windows10停止自动更新教程正解版
单机身10499元:佳能入门全画幅微单EOS R8正式上架
中国2月动力电池装车量:宁德时代、比亚迪拿下超7成市场份额
环球要闻:13日明早将现寒潮过程最低气温:上班记得多穿点
承诺捐款1100万未兑现被母校起诉 校友回应:自己会像罗永浩一样
寻味北京 | 文化活动·北京城市副中心 公共文化服务
最资讯丨Python 中连接MSSQL,MySQL,SQLite,Redis,ElasticSearch,Mongodb,PostgreSQL,Oracle,R
世界新动态:秒杀面试题!JS中this指向的理解和运用
环球精选!.NET、.NET Framework 和 .NET Core
在Linux中如何注销其他 SSH 用户
资讯推荐:补贴9万后12万买C6 博主揭雪铁龙套路玩的深!低配比高配还贵
1TB存储影像机皇!小米13 Ultra或5月发布:同步小米平板6/小米手环8
焦点速看:洛谷 P1015 回文数
世界滚动:曾称花40万买燃油车很悲催!智己CEO:智己LS7近一半车主来自BBA
世界实时:《你好李焕英》后二次合作:贾玲第二部导演作品有张小斐
全球看热讯:EntityFramworkCore7笔记
【天天时快讯】董明珠谈“35岁职场危机”:不理解 人们要到60岁才退休
宏任务&微处理
主龙骨图片_主龙骨
一次看过瘾!《流浪地球》系列两部电影下周连映:时长5小时
焦点热门:读Java性能权威指南(第2版)笔记14_垃圾回收A
环球热门:全球第15!小米13 Pro DXO音频140分:险胜iPhone 13 Pro Max
今日最新!有六百万人 沉迷在B站上看“抓小偷”
天天报道:不退休不会卖股票!董明珠:格力没实现6000亿营收目标 有遗憾
怎么利用异步设计提升系统性能?
【天天新要闻】500km续航纯电MPV!李想首曝网约车D1 Plus:项目被叫停太遗憾
全球观焦点:Go 面向对象
全球快播:Vue——Vue初始化【三】
吕钱浩:苹果2026年可能会推真全面屏iPhone 那个时候中兴已是第7代了
焦点快报!博主阿秋准备坐地铁游香港:晒证件自证是90后
环球快资讯:手机换号伤不起!当代人换手机号的成本有多高?
百事通!iPhone 17 Pro将是最完美iPhone!果粉还要等两年时间
苦是一种享受!董明珠回应仍做手机:格力一些部件必靠进口 国产质量不达标
冷水江市气象局发布大风蓝色预警【Ⅳ级/一般】
自称从清华退学考北大博主删除视频:此前收获50万点赞 快速涨粉
世界热议:PMP项目变更管理及变更流程总结
利用CSS使博客园图片自动居中,而文字保持居左
天天热文:量化交易基础 - 012 - 检验中的假设条件
全球新资讯:2999元国产显卡抢疯了 Steam游戏实测能玩 老黄旧将打造
当前快看:实拍成都6-7级大风来袭:狂风呼啸树折腰 行人雨伞秒被吹翻
邹磊委员:推进“风光水火储”多能互补综合能源供给体系建设
Log4j 配置
每日速递:flink入门-流处理
全球消息!汉诺塔问题——分而治之(引入递归,解决重复子问题)
世界球精选!Java基础入门-数组练习
国内已超越GPS 北斗卫星今年再发三颗星:下一代已在路上
世界观点:称根据身体来划分性别比较好 女星桥本爱被LGBT攻击
【独家】女生月薪两万辞职考研八次失败:次次铩羽而归
全球新资讯:第128篇:浏览器存储(cookie、webStorage、 IndexedDB)
世界简讯:关于使用python脚本将同级的其他目录下的所有文件根据年份移动到当脚本位置的年份目录
环球今热点:SSD比机械硬盘更容易坏?实测来了:跟想象中不一样
全球观天下!2月轿车销量排名:两“逸”同病相怜、秦汉一马平川
通讯!姚劲波代表:高学历干家政可能会越发普遍
《庆余年2》冲上热搜榜:网曝郭麒麟演的角色范思辙换人了
资讯:shiro-550反序列化漏洞分析
资讯:64.异常
世界热文:[新媒体运营]新媒体运营概述
9名初中生花18元点18串里脊庆生 网友看哭:回不去的年华
今日报丨金钱豹回拜游客 动物园回应:没人教、第一次见
世界今日报丨隅田川进口胶囊咖啡液8杯到手10.9元:更鲜更好喝
有赞一面:还有任务没执行,线程池被关闭怎么办?
全球快看点丨注解与反射
java基础二-面向对象的三大特性
全球最资讯丨A卡有能力跟RTX 4090正面刚 AMD:不做是因为太贵、功耗高
微头条丨深山红烛 照亮希望
环球新消息丨Redis 深度学习
环球快资讯:前端设计模式——策略模式
新消息丨MySQL学习笔记-SQL实践1
每日快报!安全性不行 Win7系统真的别用了 又一个游戏《堡垒之夜》放弃支持
每日快播:童年回来了!《灌篮高手》发布流川枫角色海报
每日报道:使用web client对 vcenter 进行补丁升级
有监督学习——梯度下降
全球百事通!聪明的燕姿
当前视点!Oracle数据库中没有scott账户的方法
今日热闻!光速破发?iPhone 14黄色版还未开售便降价600元
华硕发布ROG Strix Impact III鼠标:双手通用、可更换微动插槽
真香!重庆购买HUAWEI问界M7直补3万:起售仅25.98万