.NET Core Web API中使用Fluent Validation实现仅允许传入两个布尔查询参数之一的校验方案
.NET Core Web API中使用Fluent Validation实现仅允许传入两个布尔查询参数之一的校验方案
兄弟,我来给你捋捋这个问题哈!你之前的写法明显踩了Fluent Validation的语法坑——Must方法需要的是一个返回布尔值的委托,用来验证目标对象/属性的合法性,但你直接在里面嵌套了另一个RuleFor,这完全不符合规则,所以才会出现那个编译错误。
咱们先明确你的核心需求:用户只能传入action或promo其中一个布尔查询参数,而且不能同时传action=true和promo=true。下面给你两种贴合需求的实现方案,你可以根据实际场景选:
方案一:严格限制仅能传入一个参数(不允许同时传两个)
如果你的需求是完全不能同时传两个参数(不管参数值是true还是false),可以针对整个请求模型做跨属性验证:
首先,你的请求模型要把参数定义为可空布尔类型(因为查询参数可能不传):
public class ProductRequest { public bool? Action { get; set; } public bool? Promo { get; set; } }
然后编写验证器:
public class ProductRequestValidator : AbstractValidator<ProductRequest> { public ProductRequestValidator() { // 核心规则:只能有一个参数被设置值 RuleFor(request => request) .Must(req => (req.Action.HasValue && !req.Promo.HasValue) || (!req.Action.HasValue && req.Promo.HasValue)) .WithMessage("只能传入action或promo其中一个查询参数"); // 可选:如果要求传入的参数值必须为true(和你例子里的场景匹配) When(req => req.Action.HasValue, () => { RuleFor(x => x.Action).Equal(true).WithMessage("action参数的值必须为true"); }); When(req => req.Promo.HasValue, () => { RuleFor(x => x.Promo).Equal(true).WithMessage("promo参数的值必须为true"); }); } }
方案二:允许传两个参数,但不能同时为true
如果你的需求是可以同时传两个参数,但不能都设为true,可以调整验证规则:
public class ProductRequestValidator : AbstractValidator<ProductRequest> { public ProductRequestValidator() { // 核心规则:禁止action和promo同时为true RuleFor(request => request) .Must(req => !(req.Action == true && req.Promo == true)) .WithMessage("action和promo不能同时设置为true"); // 可选:确保至少传入一个参数(避免两个都不传的情况) RuleFor(request => request) .Must(req => req.Action.HasValue || req.Promo.HasValue) .WithMessage("必须传入action或promo其中一个查询参数"); } }
最后别忘了注册验证器
在.NET Core Web API里,你需要把验证器注册到服务容器中,这样框架才能自动触发校验:
如果你用的是.NET 6+的Program.cs:
builder.Services.AddControllers() .AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<ProductRequestValidator>());
如果你用的是旧版本的Startup.cs:
public void ConfigureServices(IServiceCollection services) { services.AddControllers() .AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<ProductRequestValidator>()); }
备注:内容来源于stack exchange,提问作者Jai
相关产品推荐
相关产品推荐

