RuleSets 规则集全攻略:Blazored.FluentValidation 分组校验进阶指南
【免费下载链接】FluentValidationA library for using FluentValidation with Blazor项目地址: https://gitcode.com/gh_mirrors/flue/FluentValidation
Blazored.FluentValidation 是一款把 FluentValidation 无缝接入 Blazor 表单的校验库,而RuleSets 规则集正是它最强大的分组校验特性。当你面对多步骤表单、分区段编辑或按业务模块校验时,规则集能让你精准控制"校验哪些规则",避免每次提交都触发全量校验。本文将用最通俗的方式,带你从零掌握规则集的分组校验配置方法。
为什么需要分组校验?一次看懂规则集的价值
普通表单校验是"全有或全无":一提交,所有字段的规则全部执行。这在分步向导、草稿保存、按模块编辑的场景中非常别扭——用户只填了第一步,你却把后面所有步骤的错误都弹出来。
RuleSets 规则集的解决思路很简单:把校验规则"分组打包",校验时可以只执行指定的一组规则。
| 场景 | 默认校验 | 规则集分组校验 |
|---|---|---|
| 分步表单(向导) | 一次校验所有步骤 | 只校验当前步骤 |
| 草稿保存 | 强校验,失败无法保存 | 轻校验,仅查必填 |
| 多模块编辑 | 全部字段统一校验 | 按模块分别触发 |
| 性能敏感场景 | 每次全量执行 | 只跑需要的规则 |
第一步:在验证器中定义规则集
规则集的"分组"动作发生在验证器里,使用 FluentValidation 的RuleSet方法即可。以项目测试中的 Model/Person.cs 为例:
public PersonValidator() { // 定义名为 "Names" 的规则集,只包含姓名相关规则 RuleSet("Names", () => { RuleFor(p => p.FirstName) .NotEmpty().WithMessage(FirstNameRequired) .MaximumLength(50).WithMessage(FirstNameMaxLength); RuleFor(p => p.LastName) .NotEmpty().WithMessage(LastNameRequired) .MaximumLength(50).WithMessage(LastNameMaxLength); }); // 以下 Age、Email 等规则不在任何规则集中,属于"默认规则" RuleFor(p => p.Age) .NotNull().WithMessage(AgeRequired) .GreaterThanOrEqualTo(0).WithMessage(AgeMin) .LessThan(150).WithMessage(AgeMax); }关键点:放进RuleSet的规则,默认校验时不会执行;只有在校验时显式指定规则集,它们才会生效。这正是分组校验灵活性的来源。
方法一:通过 Options 参数配置规则集(声明式配置)
最直观的规则集用法,是在<FluentValidationValidator>组件上通过Options参数声明要包含的规则集。这种方式适合"组件固定只校验某一组规则"的场景:
<EditForm Model="@_person" OnValidSubmit="@SubmitValidForm"> <FluentValidationValidator Options="@(options => options.IncludeRuleSets("Names"))" /> <ValidationSummary /> <p> <label>First name: </label> <InputText @bind-Value="@_person.FirstName" /> </p> <button type="submit">Save</button> </EditForm>声明之后,该表单的所有校验(包括字段级校验)都会自动限定在Names规则集内。相关实现可在 FluentValidationsValidator.cs 中看到Options参数的完整定义。
方法二:通过代码手动校验指定规则集(编程式配置)
如果你的规则集选择是动态的(比如随步骤变化),更推荐通过代码触发校验。先给组件加上@ref,再调用Validate方法并传入规则集选项:
<FluentValidationValidator @ref="_fluentValidationValidator" /> <ValidationSummary /> @code { private FluentValidationValidator? _fluentValidationValidator; private Person _person = new(); private void ValidateNamesOnly() => _fluentValidationValidator?.Validate(options => options.IncludeRuleSets("Names")); }异步场景同样支持,换成ValidateAsync即可。这种方式与 RuleSets/Component.razor 中的用法完全一致,非常适合"下一步"按钮只校验当前步骤的逻辑。
进阶玩法:如何同时校验多个规则集
业务复杂时,一个规则集往往不够。IncludeRuleSets支持传入多个名称,一次校验多组规则:
// 同时校验 "Names" 和 "Address" 两个规则集 validator.Validate(options => { options.IncludeRuleSets("Names", "Address"); });如果你想"校验规则集 + 所有默认规则",还可以组合IncludeRulesNotInRuleSet(),实现"指定的组 + 公共规则"一起执行,灵活度非常高。
规则集使用避坑指南
- 默认规则不会自动执行:放在
RuleSet里的规则,不指定规则集就不会跑。别指望"定义了就生效"。 - 规则集内没有的字段不校验:只校验
Names规则集时,Age、Email 等字段即使为空也不会报错,这正是分组校验的预期行为。 - 命名保持一致:
RuleSet("Names")与IncludeRuleSets("Names")中的字符串必须完全一致,大小写敏感。 - 异步校验别忘用 Async:规则中含异步校验时,请使用
ValidateAsync,可参考 FluentValidationsValidator.cs 的实现。
总结
RuleSets 规则集是 Blazored.FluentValidation 处理复杂表单的"杀手锏":声明式Options适合固定分组,编程式Validate(options)适合动态分组,两者配合即可覆盖绝大多数分组校验需求。项目完整示例与测试代码位于 RuleSets/,动手跑一遍测试(Tests.cs),你就能快速吃透这套分组校验玩法。下次再做多步骤表单,不妨试试规则集,让校验逻辑清晰又高效。
【免费下载链接】FluentValidationA library for using FluentValidation with Blazor项目地址: https://gitcode.com/gh_mirrors/flue/FluentValidation
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考