ModelState是ASP.NET Core中的一个重要机制,它用于表示模型绑定和验证的状态。在Web API中,ModelState会跟踪模型绑定的结果以及验证过程中的任何错误。
虽然Get请求通常用于检索数据而非修改数据,但仍然需要进行ModelState验证,原因如下:
[HttpGet]
public IActionResult GetProducts([FromQuery] ProductQuery query)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
// 处理逻辑
}
[HttpGet("{id:int}")]
public IActionResult GetProduct(int id)
{
if (id <= 0)
{
ModelState.AddModelError("id", "ID必须大于0");
return BadRequest(ModelState);
}
// 处理逻辑
}
public class ProductQuery
{
[Range(1, 100)]
public int PageSize { get; set; }
[Range(1, int.MaxValue)]
public int PageNumber { get; set; }
[StringLength(50)]
public string NameFilter { get; set; }
}
问题1:为什么我的Get请求参数验证不起作用?
原因:可能没有正确应用数据注解或忘记检查ModelState。
解决方案:
[HttpGet]
public IActionResult Search([FromQuery] SearchParameters parameters)
{
if (!ModelState.IsValid) // 必须显式检查
{
return BadRequest(ModelState);
}
// 处理逻辑
}
问题2:如何自定义Get请求的错误响应?
解决方案:
[HttpGet]
public IActionResult Get([FromQuery] CustomQuery query)
{
if (!ModelState.IsValid)
{
var errors = ModelState
.Where(e => e.Value.Errors.Count > 0)
.ToDictionary(
e => e.Key,
e => e.Value.Errors.Select(x => x.ErrorMessage).ToArray()
);
return BadRequest(new { Errors = errors });
}
// 处理逻辑
}
public class PaginationQuery
{
[Range(1, int.MaxValue)]
public int Page { get; set; } = 1;
[Range(1, 100)]
public int PageSize { get; set; } = 10;
}
public class DateRangeQuery : IValidatableObject
{
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (EndDate < StartDate)
{
yield return new ValidationResult(
"结束日期不能早于开始日期",
new[] { nameof(EndDate) });
}
}
}
public class ValidateModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
context.Result = new BadRequestObjectResult(context.ModelState);
}
}
}
// 在Startup.cs中全局注册
services.AddControllers(options =>
{
options.Filters.Add<ValidateModelAttribute>();
});
总之,即使在Get请求中,ModelState验证也是确保API健壮性和安全性的重要手段,应该根据实际需求合理使用。
没有搜到相关的文章