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
相关产品推荐
相关产品推荐

