自定义规则与条件规则
构建复杂的条件验证逻辑。
自定义规则与条件规则 是 CoddyKit 上的免费 C# Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。
超越内置验证器
实际项目中的验证通常需要自定义逻辑:例如验证某个值是否通过领域检查,或某条规则是否只在特定条件下适用。FluentValidation 通过 Must、When 和自定义验证器类型支持这两种场景。
Must 谓词
Must 接收一个谓词,当值有效时该谓词返回 true。这是以内联方式表达任意逻辑的最简单方法。
RuleFor(c => c.Username)
.Must(name => !name.Contains(" "))
.WithMessage("Username cannot contain spaces.");让 Must 访问整个对象
Must 的一个重载会同时提供父对象和属性值,从而支持跨属性检查。
RuleFor(o => o.DiscountedPrice)
.Must((order, discounted) => discounted <= order.OriginalPrice)
.WithMessage("Discounted price cannot exceed original price.");使用 When 定义条件规则
When 仅在条件成立时应用规则。在这里,只有实体订单才需要提供收货地址。
RuleFor(o => o.ShippingAddress)
.NotEmpty()
.When(o => o.RequiresShipping);Unless 修饰符
Unless 是 When 的反向形式:除非条件为真,否则规则都会运行。
RuleFor(o => o.CouponCode)
.NotEmpty()
.Unless(o => o.IsGift);组合条件
将多个规则放在同一个 When(...) 块中,即可让它们清晰地共享一个条件。
When(o => o.RequiresShipping, () =>
{
RuleFor(o => o.ShippingAddress).NotEmpty();
RuleFor(o => o.PostalCode).NotEmpty();
});使用 MustAsync 编写异步自定义逻辑
当检查需要访问数据库或 API 时,请使用 MustAsync。使用 ValidateAsync 验证模型。
RuleFor(u => u.Email)
.MustAsync(async (email, cancellation) =>
!await _repository.EmailExistsAsync(email))
.WithMessage("Email is already registered.");编写可复用的自定义验证器
对于需要在多个项目中复用的逻辑,请在 IRuleBuilder 上编写扩展方法。这样可以将自定义规则变成一等的可链式验证器。
public static class CustomValidators
{
public static IRuleBuilderOptions<T, string> ValidSlug<T>(
this IRuleBuilder<T, string> rule)
{
return rule.Matches("^[a-z0-9-]+$")
.WithMessage("Must be a lowercase slug.");
}
}使用自定义验证器
定义扩展后,它的链式用法与内置验证器一样,同时让验证器保持清晰易懂。
RuleFor(p => p.Slug).NotEmpty().ValidSlug();使用 Custom 方法实现完全控制
对于复杂结果,Custom 可以让您通过上下文以命令式方式添加验证失败信息。
RuleFor(o => o.Items).Custom((items, context) =>
{
if (items.Count == 0)
context.AddFailure("An order must contain at least one item.");
});级联模式
默认情况下,即使链中的某个验证器失败,所有验证器仍会继续运行。设置 CascadeMode.Stop 可以在首次失败时停止,从而避免重复或不安全的检查。
RuleFor(c => c.Email)
.Cascade(CascadeMode.Stop)
.NotEmpty()
.EmailAddress();快速检查
测试条件规则和自定义规则。
回顾
自定义规则和条件规则让 FluentValidation 更加灵活:使用 Must 表达内联谓词(其重载可以访问整个对象),使用 When/Unless 表达条件,使用分组的 When 块,使用 MustAsync 执行 I/O 检查,使用 IRuleBuilder 扩展复用逻辑,使用命令式的 Custom 方法,并使用 Cascade 模式控制求值流程。
常见问题解答
「自定义规则与条件规则」课时是免费的吗?
是的 — 「自定义规则与条件规则」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。
「自定义规则与条件规则」这节课中我会学到什么?
构建复杂的条件验证逻辑。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C# Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「自定义规则与条件规则」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C# Academy 课中编写并运行代码吗?
能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 数据注解验证
- FluentValidation 规则
- 自定义规则与条件规则
- 将验证集成到 API