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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 09:04:36