对 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)
步骤:
- 定义模型并应用自定义验证特性。
- 实现自定义验证特性类。
- 控制器加
[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)
步骤:
- 定义模型。
- 控制器方法中手动检查
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(第三方库)
步骤:
- 安装 NuGet 包:
FluentValidation.AspNetCore - 定义模型和验证器。
- 在
Startup或 Program 中注册 FluentValidation。 - 控制器加
[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 和详细错误信息。