在asp.net 控制器传入json对象的格式验证的几种方法

MyModel model 进行格式验证,常用方法主要有以下几种:


1. 数据注解(Data Annotations)

在模型属性上添加特性,自动进行格式验证。

csharp 复制代码
public class MyModel
{
    [Required]
    [StringLength(50, MinimumLength = 3)]
    public string Name { get; set; }

    [Range(1, 100)]
    public int Age { get; set; }

    [EmailAddress]
    public string Email { get; set; }
}

控制器中只需 [ApiController],框架会自动验证,验证失败时返回 400。

好的,下面详细演示第2、3、4种格式验证方式,并说明如何自动触发验证。


2. 自定义验证特性(Custom Validation Attribute)

步骤:

  1. 定义模型并应用自定义验证特性。
  2. 实现自定义验证特性类。
  3. 控制器加 [ApiController],自动触发验证。
csharp 复制代码
public class MyModel
{
    [Required]
    [StartsWithA] // 应用自定义验证特性
    public string Code { get; set; }
}
csharp 复制代码
public class StartsWithAAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value is string str && str.StartsWith("A"))
            return ValidationResult.Success;
        return new ValidationResult("Code 必须以 'A' 开头");
    }
}
csharp 复制代码
[ApiController]
[Route("[controller]")]
public class ProductsController : ControllerBase
{
    [HttpPost]
    public IActionResult Post([FromBody] MyModel model)
    {
        // 只要加了 [ApiController],验证失败时框架会自动返回 400,方法体不会被执行
        return Ok("验证通过");
    }
}

说明:

只要控制器有 [ApiController],请求到达时会自动验证模型,验证失败自动返回 400 和错误信息。


3. 控制器中手动验证(Manual Validation in Controller)

步骤:

  1. 定义模型。
  2. 控制器方法中手动检查 ModelState 或自定义业务逻辑。
csharp 复制代码
public class MyModel
{
    public string Name { get; set; }
    public int Age { get; set; }
}
csharp 复制代码
[ApiController]
[Route("[controller]")]
public class ProductsController : ControllerBase
{
    [HttpPost]
    public IActionResult Post([FromBody] MyModel model)
    {
        // 可以手动检查 ModelState
        if (!ModelState.IsValid)
            return BadRequest(ModelState);

        // 也可以自定义业务逻辑
        if (model.Name == "admin")
            return BadRequest("Name 不能为 admin");

        return Ok("验证通过");
    }
}

说明:

手动检查 ModelState 或自定义逻辑,灵活处理特殊场景。[ApiController] 依然会自动做基础验证,但你可以补充更多业务校验。


4. FluentValidation(第三方库)

步骤:

  1. 安装 NuGet 包:FluentValidation.AspNetCore
  2. 定义模型和验证器。
  3. Startup 或 Program 中注册 FluentValidation。
  4. 控制器加 [ApiController],自动触发验证。
csharp 复制代码
public class MyModel
{
    public string Name { get; set; }
    public int Age { get; set; }
}
csharp 复制代码
using FluentValidation;

public class MyModelValidator : AbstractValidator<MyModel>
{
    public MyModelValidator()
    {
        RuleFor(x => x.Name).NotEmpty().Length(3, 50);
        RuleFor(x => x.Age).InclusiveBetween(1, 100);
    }
}
csharp 复制代码
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
            .AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<MyModelValidator>());
}
csharp 复制代码
[ApiController]
[Route("[controller]")]
public class ProductsController : ControllerBase
{
    [HttpPost]
    public IActionResult Post([FromBody] MyModel model)
    {
        // 验证失败时自动返回 400,方法体不会被执行
        return Ok("验证通过");
    }
}

说明:

注册 FluentValidation 后,框架会自动调用验证器。只要控制器有 [ApiController],验证失败时自动返回 400。


总结:

  • 自定义特性和 FluentValidation 都能自动触发验证(依赖 [ApiController])。
  • 手动验证适合补充业务逻辑或特殊场景。
  • 自动验证失败时,控制器方法不会被执行,直接返回 400 和详细错误信息。
相关推荐
程序员小崔日记25 分钟前
技术之外,皆是人间
后端·ruoyi·计算机温情
不懂的浪漫1 小时前
# mqtt-plus 架构解析(八):Spring Boot 自动装配,这些零件是怎么被粘合起来的
spring boot·后端·物联网·mqtt·架构
开心就好20251 小时前
Flutter iOS应用混淆与安全配置详细文档指南
后端·ios
掘金者阿豪1 小时前
记一次NFS下的权限踩坑:从“Operation not permitted”到安装成功的折腾实录
后端
妙蛙种子3111 小时前
【Java设计模式 | 创建者模式】 原型模式
java·开发语言·后端·设计模式·原型模式
阿聪谈架构1 小时前
第07章(下):LangGraph 工作流进阶 —— 检查点、人工介入与多 Agent 协作
人工智能·后端
希望永不加班1 小时前
SpringBoot 配置绑定:@ConfigurationProperties
java·spring boot·后端·spring
悟空码字2 小时前
MySQL性能优化的天花板:10条你必须掌握的顶级SQL分析技巧
java·后端·mysql
Soofjan2 小时前
Go interface 源码:iface、itab、getitab 与动态派发
后端
Soofjan2 小时前
Go interface:语法、接口值与常见坑
后端