You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ModelState.IsValid不验证集合属性始终返回true,如何验证ShapeDetails?

解决Shape验证时未包含ShapeDetails集合的问题

你遇到的问题是因为FluentValidation默认不会自动验证嵌套的集合属性,所以需要在ShapeValidator中显式配置对ShapeDetails集合的验证规则。

修改你的ShapeValidator

只需要在ShapeValidator的构造函数中添加一行代码,用RuleForEach遍历集合中的每个ShapeDetail实例,并指定对应的验证器:

public class ShapeValidator : AbstractValidator<Shape> { 
    public ShapeValidator() { 
        RuleFor(x => x.Name).NotEmpty().Length(1, 225);
        // 新增:验证集合中的每个ShapeDetail元素
        RuleForEach(x => x.ShapeDetails).SetValidator(new ShapeDetailValidator());
    } 
}

可选:验证集合本身

如果需要确保ShapeDetails集合不能为空(至少有一个元素),可以再添加一条规则:

RuleFor(x => x.ShapeDetails)
    .NotEmpty()
    .WithMessage("必须至少提供一个形状详情");

为什么这样有效?

  • RuleForEach会遍历ShapeDetails中的每一项,对每个ShapeDetail实例应用ShapeDetailValidator里定义的所有规则(比如RangeFrom、RangeTo、Price的验证)。
  • 当你调用ModelState.IsValid时,ASP.NET Core会触发ShapeValidator的验证逻辑,同时自动验证集合中的所有子项,任何子项不符合规则都会导致ModelState.IsValid返回false,错误信息也会被正确添加到ModelState中。

额外注意

确保你已经在ASP.NET Core项目中正确注册了FluentValidation服务(如果还没做的话),比如在Program.cs中:

builder.Services.AddControllers()
    .AddFluentValidation(fv => 
        fv.RegisterValidatorsFromAssemblyContaining<ShapeValidator>()
    );

这样修改后,就能完整验证Shape及其包含的所有ShapeDetails了。

内容的提问来源于stack exchange,提问作者tickwave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:13:38