ASP.NET Core Blazor 核心功能二:Blazor表单和验证

news/2025/11/4 11:23:51/文章来源:https://www.cnblogs.com/shenchuanchao/p/19189573

大家好,我是码农刚子。本文介绍了Blazor中EditForm组件的使用及表单验证方案。主要内容包括:

1)EditForm基础用法,通过Model参数绑定模型,使用DataAnnotationsValidator实现数据注解验证;

2)自定义验证规则实现,通过继承ComponentBase创建CustomValidator组件,结合ValidationMessageStore管理验证消息;

3)集成第三方验证库FluentValidation,展示如何定义复杂业务规则验证。文章提供了完整代码示例,涵盖内置验证、自定义验证和第三方验证三种方案,帮助开发者灵活处理Blazor表单验证需求。

一、EditForm 组件使用

Blazor 的 EditForm 是一个强大的组件,用于处理表单输入和验证。它通过绑定模型和验证逻辑,简化了表单的开发过程。以下是 EditForm 的核心功能和使用示例。

Blazor 表单内置组件

67b1af17adffb47f738b8efbc8f1fc12

 

基本功能

EditForm 组件通过 Model 参数绑定到一个模型实例,并使用 DataAnnotationsValidator 组件支持基于数据注释的验证。它提供了以下事件回调:

  • OnValidSubmit:当表单验证通过时触发。
  • OnInvalidSubmit:当表单验证失败时触发。
  • OnSubmit:无论验证状态如何,都会触发。

以下是一个简单的表单示例:

@page "/formsample"
@using System.ComponentModel.DataAnnotations;
<h3>表单</h3>
<p>@stu.ToString()</p><EditForm Model="@stu" OnValidSubmit="onValidSubmit" OnInvalidSubmit="onInvalidSubmit"><DataAnnotationsValidator></DataAnnotationsValidator><ValidationSummary></ValidationSummary><div class="form-inline">姓名:<InputText @bind-Value="stu.name"></InputText><ValidationMessage For="() => stu.name" /></div><div class="form-inline">年龄:<InputNumber @bind-Value="stu.age"></InputNumber></div><div class="form-inline">生日:<InputDate @bind-Value="stu.birthday"></InputDate></div><div class="form-inline">是否婚配:  <InputCheckbox @bind-Value="stu.ismarried"></InputCheckbox></div><div class="form-inline">现居城市:<InputSelect @bind-Value="stu.city"><option value="北京">北京</option><option value="上海">上海</option><option value="广州">广州</option><option value="深圳">深圳</option></InputSelect></div><button type="submit">Submit</button></EditForm>@code {public class student{[Required][StringLength(10, ErrorMessage = "名字最大长度不能超过10位")]public string name { get; set; } = "码农刚子";     //姓名
[Range(18, 45, ErrorMessage = "年龄必须在18-45岁之间")]public int age { get; set; } = 26; //年龄public DateTime birthday { get; set; } = System.DateTime.Now;//生日public string city { get; set; } = "深圳";  //所在城市public bool ismarried { get; set; } = false; //是否婚配public override string ToString(){return $"姓名:{name},年龄:{age},生日:{birthday},城市:{city},是否婚配:{ismarried}";}}public student stu = new student() { };private EditContext editContext;protected override void OnInitialized(){editContext = new EditContext(stu);}public void onSubmit(){Console.WriteLine("on onSubmit");}public void onValidSubmit(){Console.WriteLine("on onValidSubmit");}public void onInvalidSubmit(){Console.WriteLine(" onInvalidSubmit");}}

验证与错误处理

通过 ValidationSummary 组件可以显示所有验证错误,而 ValidationMessage 组件可以针对特定字段显示错误信息。数据注释如 [Required][StringLength] 用于定义验证规则。

EditForm 提供了一系列数据验证的属性/方法,这样我们不用自己再去实现了。

属性/方法

说明

Modal

表单实体模型,必填

OnValidSubmit/OnInvalidSubmit

提交表单时,验证通过/未通过 的回调函数

OnSubmit

提交表单时的回调函数,和上面的两个属于“或”的关系,

使用了OnValidSubmit/OnInvalidSubmit就不能再使用OnSubmit。同理,使用了OnSubmit就不能使用OnValidSubmit/OnInvalidSubmit

OnSubmit可以用来做一些自定义的验证

DataAnnotationsValidator

 

启用数据注解验证,就是特性验证。

ValidationSummary

验证结果摘要。验证不合法时,会在表单的顶部用html标签显示具体错误。也是继承自ComponentBase的一种组件

二、自定义验证规则

自定义 ValidationMessageStore

如果需要更复杂的校验逻辑,可以使用 ValidationMessageStore 手动管理验证消息。

我们来自定义一个验证组件:

关于验证的组件思路,我们首先肯定是要从ComponentBase组件来集成,然后我们上面有学习到<EditForm>会定义一个级联值,我们自定义的组件也是嵌入到EditForm中,因此我们需要定义级联参数从而引用该值,我们先放代码:

using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;namespace BlazorApp
{public class CustomValidator:ComponentBase{private ValidationMessageStore messageStore;[CascadingParameter]private EditContext currentEditContext { get; set; }protected override void OnInitialized(){if (currentEditContext == null){throw new InvalidOperationException($"{nameof(CustomValidator)} requires a cascading " +$"parameter of type {nameof(EditContext)}. For example, you can use {nameof(CustomValidator)} " +$"inside an EditForm.");}messageStore = new ValidationMessageStore(currentEditContext);currentEditContext.OnValidationRequested += (s, e) => messageStore.Clear();currentEditContext.OnFieldChanged += (s, e) => messageStore.Clear(e.FieldIdentifier);}public void DisplayErrors(Dictionary<string, List<string>> errors) {foreach (var error in errors){var fieldIdentifier = new FieldIdentifier(currentEditContext.Model, error.Key);messageStore.Add(fieldIdentifier, error.Value);}currentEditContext.NotifyValidationStateChanged();}public void ClearErrors(){messageStore.Clear();currentEditContext.NotifyValidationStateChanged();}}
}

我们需要注意到,在这个组件里我们同时监听了EditContext的onValidationRequest事件,以及OnFieldChange事件,同时我们使用了一个字段ValidationMessageStore, 主要是用于验证的消息保存,另外我们使用DisplayErrors 收集来自组件的错误信息,同时使用EditContext通知订阅了事件ValidationStateChanged的接收者。

然后我们在EditForm里应用该组件,代码如下:

@page "/formsample1"
@using System.ComponentModel.DataAnnotations;
<h3>表单</h3>
<p>@stu.ToString()</p><EditForm Model="@stu" OnValidSubmit="@HandleValidSubmit"><DataAnnotationsValidator></DataAnnotationsValidator><CustomValidator @ref="customValidator" /><div class="form-inline">姓名:<InputText @bind-Value="stu.name"></InputText><ValidationMessage For="() => stu.name" /></div><div class="form-inline">年龄:<InputNumber @bind-Value="stu.age"></InputNumber><ValidationMessage For="() => stu.age" /></div><div class="form-inline">生日:<InputDate @bind-Value="stu.birthday"></InputDate></div><div class="form-inline">是否婚配:  <InputCheckbox @bind-Value="stu.ismarried"></InputCheckbox></div><div class="form-inline">现居城市:<InputSelect @bind-Value="stu.city"><option value="北京">北京</option><option value="上海">上海</option><option value="广州">广州</option><option value="深圳">深圳</option></InputSelect></div><button type="submit">Submit</button></EditForm>@code {public class student{[Required][StringLength(10, ErrorMessage = "名字最大长度不能超过10位")]public string name { get; set; } = "码农刚子";     //姓名public int age { get; set; } = 26; //年龄public DateTime birthday { get; set; } = System.DateTime.Now;//生日public string city { get; set; } = "深圳";  //所在城市public bool ismarried { get; set; } = false; //是否婚配public override string ToString(){return $"姓名:{name},年龄:{age},生日:{birthday},城市:{city},是否婚配:{ismarried}";}}public student stu = new student() { };private CustomValidator customValidator;private ValidationMessageStore messageStore;private void HandleValidSubmit(){customValidator.ClearErrors();var errors = new Dictionary<string, List<string>>();if (stu.name == "admin"){errors.Add(nameof(stu.name), new List<string> { "姓名不能为 admin" });}if (stu.age < 18 || stu.age > 60){errors.Add(nameof(stu.age), new List<string> { "年龄必须在 18 到 60 岁之间" });}if (errors.Count > 0){customValidator.DisplayErrors(errors);}else        {Console.WriteLine($"表单提交成功:{stu.ToString()}!");            }}}

三、第三方验证库(如 FluentValidation)

在 Blazor 应用中,使用像 FluentValidation 这样的第三方库来处理表单验证,可以让你摆脱内置数据注解的限制,更灵活地定义复杂的业务验证规则。社区提供了诸如 Blazored.FluentValidation 这样的库来简化集成工作。

1. 安装 NuGet 包

根据你选择的 FluentValidation Blazor 集成库,在项目目录下执行安装命令,或者手动打开管理NuGet程序包,搜索安装。例如,使用 Blazored.FluentValidation包:

dotnet add package FluentValidation
dotnet add package Blazored.FluentValidation

2. 创建模型与验证器

创建一个数据模型(例如 User 类)和对应的验证器类。

// 模型类
public class User
{public string Name { get; set; }public string Email { get; set; }
}// 验证器类
using FluentValidation;public class UserValidator : AbstractValidator<User>
{public UserValidator(){// 定义验证规则RuleFor(user => user.Name).NotEmpty().WithMessage("姓名不能为空。") // 非空验证.MaximumLength(10).WithMessage("姓名长度不能超过10个字符。"); // 最大长度验证
RuleFor(user => user.Email).NotEmpty().WithMessage("邮箱地址不能为空。").EmailAddress().WithMessage("请输入有效的邮箱地址。"); // 邮箱格式验证
    }
}

3. 注册验证器服务

Program.cs 文件中,将你的自定义验证器注册到依赖注入容器中。

using FluentValidation;// ... 其他服务配置

builder.Services.AddTransient<IValidator<User>, UserValidator>();

4. 在 Blazor 组件中使用

在你的 Razor 组件(.razor 文件)中,使用 <FluentValidationValidator> 组件来启用 FluentValidation。

@page "/user-form"
@using BlazorApp.Data  <!-- 根据实际使用的库引入命名空间 -->
@using Blazored.FluentValidation
@using FluentValidation<EditForm Model="@user" OnValidSubmit="HandleValidSubmit"><!-- 使用 FluentValidation 验证器 --><FluentValidationValidator /><div class="form-group"><label for="name">姓名:</label><InputText id="name" @bind-Value="user.Name" class="form-control" /><!-- 显示该字段的验证消息 --><ValidationMessage For="@(() => user.Name)" /></div><div class="form-group"><label for="email">邮箱:</label><InputText id="email" @bind-Value="user.Email" class="form-control" /><ValidationMessage For="@(() => user.Email)" /></div><button type="submit" class="btn btn-primary">提交</button><!-- 显示验证摘要 --><ValidationSummary />
</EditForm>@code {private User user = new User();private void HandleValidSubmit(){// 当表单通过所有验证时,会执行此方法Console.WriteLine($"提交用户:{user.Name}, {user.Email}");// 这里可以添加提交数据到服务器的逻辑
    }
}

 以上就是《ASP.NET Core Blazor 核心功能二:Blazor表单和验证》的全部内容,希望你有所收获。关注、点赞,持续分享。 

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

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

相关文章

2025年11月黄黑皮美白面霜推荐榜:十款持证淡斑产品口碑排行

站在镜子前,你或许正为肤色暗沉、痘印难消而反复试错:黄黑皮本身黑色素活跃,稍受紫外线或熬夜刺激,色斑便加深;市面美白成分常伴随刺痛、脱皮,敏感肌更不敢轻易尝试;再加上“持证”信息分散、浓度标注不清,选品…

2025年11月黄黑皮美白产品评测榜:十款温和提亮面霜排名一览

站在镜子前,你或许正为肤色暗沉、痘印难消而叹气:粉底盖不住,遮瑕又显灰,拍照永远靠滤镜。黄黑皮的美白诉求并非“一夜漂白”,而是希望在不刺激、不反黑的前提下,让肤色均匀、透亮、有生气。2025年《中国皮肤健康…

2025年11月常州光伏公司排名最新榜单:十大企业综合实力对比分析

摘要 随着碳中和目标的推进,常州光伏产业迎来新一轮发展机遇。本文基于企业规模、技术创新、市场口碑等维度,对常州光伏公司排名进行全面评估,旨在为行业投资者和终端用户提供参考。榜单数据来源于权威行业报告及企…

QP(状态机事件驱动型框架)

1 QP框架为什么简称QP QP 这个简称可以理解为: 1)Quantum(量子) + Platform(平台) = QP 2)量子跃迁是指微观粒子(如原子或分子)从一个量子态突然转变到另一个量子态的过程,伴随能量的吸收或释放。 3)一个借…

深圳市德恺检测有限公司:您的CNAS/CMA实验室认证咨询专业伙伴

深圳市德恺检测有限公司专注CNAS/CMA实验室认证一站式“包过”服务,10+年经验、500+成功案例,帮助企业高效获证,提升公信力与利润。覆盖双认证、扩项维护,适用于检测、校准领域,助力2025年市场竞争力。 在检测市场…

2025 最新智能食堂秤厂家/推荐排行榜:溯源 / 验收 / 留样秤品牌权威盘点及选购指南食堂验收智能秤/生鲜分拣智能秤/留样智能秤公司推荐

引言 智慧食堂建设的加速推进,让智能食堂秤成为保障食材计量精准、提升运营效率的核心设备,市场需求持续攀升。但当前市场乱象丛生:部分品牌缺乏核心技术,产品存在称重误差大、稳定性不足等问题;部分厂家服务体系…

贪心题目小结

题目壹 货物堆叠 时间限制:1秒 | 内存限制:128兆字节 题目描述 商店中有 n 件货物,每件货物 i 有重量 wi、初始体积 vi 和压缩系数 ci。将货物堆叠成一堆时,货物 i 的实际体积为 vi - ci * W,其中 W 是其上方所有…

faust-一个可以切换合成器音色的lfo demo

faust-一个可以切换合成器音色的lfo demoimport("stdfaust.lib");// 0 1 2 3: sin,tri,saw,square wave_shape = hslider("合成器波形选择[style:knob]",0,0,3,1);// 0 1 2 3: sin,tri,saw,square…

AGC052 VP

AGC 052 [AGC052A] Long Common Subsequence skip。 [AGC052B] Tree Edges XOR 给定一棵树,每条边有初始权值和目标权值,每次可以选择一条当前权值为 \(w\) 连接 \(u\),\(v\) 的边,将其他与 \(u\) 或 \(v\) 相连的…

2025 年液位计厂家最新推荐榜单:涵盖投入式 / 磁致伸缩 / 防爆 / 防水 / 浮球等类型,全面解析行业领先品牌技术与市场优势

引言 在工业生产与各类工程应用中,液位计是保障生产安全、提升效率的关键设备。但当前市场品牌繁杂,产品性能差异显著,为帮助用户精准选择,行业协会联合专业测评机构开展了 2025 年液位计品牌测评工作。 测评采用多…

落地案例分享 | 个人决策平台界面设计

落地案例分享 | 个人决策平台界面设计

2025学习机黑马登场!松鼠AI S20实测两个月——孩子主动刷题、精准提分不是梦

🏁 开篇:松鼠AI S20,2025年学习机中的真正黑马 2025年9月选学习机时,我没有追随“热门大牌”,而是选择了深耕自适应教育11年的专业品牌——松鼠AI。最终花近6000元入手它的旗舰机型:松鼠AI S20学习机。 作为测评…

【URP】Unity[后处理]颜色查询ColorLookup

技术定义与核心作用 ColorLookup是基于LUT(Lookup Table)技术的颜色映射系统,通过预定义的256x16像素条状PNG纹理实现全局色彩替换。其核心价值在于: ‌风格统一‌:批量修【从UnityURP开始探索游戏渲染】专栏-直达…

2025年11月常州光伏公司排名:前十强企业综合评估与选择指南

摘要 随着全球能源转型加速,常州作为中国光伏产业的重要基地,近年来在光伏技术研发、制造和应用领域取得了显著进展。本文基于行业数据、企业口碑及技术实力,整理出常州光伏公司排名前十的榜单,旨在为投资者、合作…

11/4

11/411:05基础 HTTP GET 接口请求测试操作步骤: 1.打开 JMeter,新建测试计划,右键添加线程组”(线程数1、循环次数1)。 2.线程组下添加HTTP请求”,服务器名称/IP填写httpbin.org,端口80,请求方法选GET,路径填写…

网站地址

dbeaver下载地址: https://dbeaver.io/download/

2025年吸烟亭公司排名前十:合肥荣东智能环保科技有限公司领跑行业

摘要 吸烟亭行业在2025年迎来快速发展,随着公共场所控烟政策加强和环保意识提升,专业吸烟亭需求激增。本文基于市场调研和用户反馈,综合评估吸烟亭公司的技术实力、产品质量和服务口碑,推出排名前十的企业名单,并…

2025年吸烟亭厂家综合排名:合肥荣东智能环保领衔行业标杆

文章摘要 随着环保政策加强和公共场所吸烟区需求增长,吸烟亭行业在2025年迎来快速发展。本文基于产品工艺、成本控制及客户案例,深度解析前十名吸烟亭厂家排名,为采购商提供权威参考。表单数据来源于市场调研和用户…

jmx接口

3. 简单接口并发测试 操作步骤: 1. 新建线程组,设置线程数5、循环次数2、 ramp-up时间3秒(每秒启动约2个线程)。2. 添加HTTP请求(GET方法,服务器httpbin.org,路径/delay/1,模拟1秒响应接口)。3. 添加“聚合报…