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

.NET 7 Minimal API中FluentValidation如何实现自动请求验证?

在.NET 7 Minimal API中用FluentValidation 11.5.1实现自动请求验证

你可以通过FluentValidation.AspNetCore包提供的Minimal API支持来实现自动验证,无需手动注入IValidator<T>,验证失败时直接返回400错误,完全符合你的需求。具体步骤如下:

1. 安装依赖包

首先确保安装对应版本的FluentValidation.AspNetCore:

dotnet add package FluentValidation.AspNetCore --version 11.5.1

2. 配置服务

在Program.cs中注册FluentValidation的自动验证服务,替代已弃用的AddMvc().AddFluentValidation():

var builder = WebApplication.CreateBuilder(args);

// 注册FluentValidation自动验证适配
builder.Services.AddFluentValidationAutoValidation()
                .AddFluentValidationClientsideAdapters();

// 注册你的验证器(二选一即可)
// 方式1:单独注册单个验证器
builder.Services.AddScoped<IValidator<UserRequest>, UserRequestValidator>();
// 方式2:批量注册程序集中所有的验证器(更推荐)
// builder.Services.AddValidatorsFromAssemblyContaining<UserRequestValidator>();

var app = builder.Build();

3. 定义请求模型和验证规则

创建你的UserRequest模型以及对应的验证器:

public class UserRequest
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class UserRequestValidator : AbstractValidator<UserRequest>
{
    public UserRequestValidator()
    {
        RuleFor(x => x.Name)
            .NotEmpty().WithMessage("用户名不能为空")
            .MinimumLength(3).WithMessage("用户名长度不能少于3个字符");

        RuleFor(x => x.Age)
            .GreaterThanOrEqualTo(18).WithMessage("年龄必须年满18岁");
    }
}

4. 编写Minimal API端点

直接将UserRequest作为端点参数,框架会自动执行验证:

app.MapPost("/add-user", (UserRequest request) =>
{
    // 只有验证通过才会进入这里,无需手动调用验证方法
    return Results.Ok($"用户 {request.Name} 创建成功");
})
.WithName("AddUser")
.WithOpenApi();

app.Run();

验证失败的行为

当请求不符合验证规则时,系统会自动返回400 Bad Request,响应体为标准的ProblemDetails格式,包含所有错误信息,和数据注解验证的效果完全一致。

可选自定义配置

如果需要调整验证行为,比如禁用数据注解验证、自定义错误响应格式,可以通过配置选项实现:

builder.Services.AddFluentValidationAutoValidation(config =>
{
    // 禁用数据注解验证,只使用FluentValidation的规则
    config.DisableDataAnnotationsValidation = true;
    // 自定义验证失败后的处理逻辑(比如返回自定义响应)
    config.ValidationFailed += (context, errors) =>
    {
        context.HttpContext.Response.StatusCode = StatusCodes.Status400BadRequest;
        context.HttpContext.Response.ContentType = "application/json";
        var customErrors = errors.Select(e => new { Field = e.PropertyName, Message = e.ErrorMessage });
        return context.HttpContext.Response.WriteAsJsonAsync(customErrors);
    };
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:35:15