.net core web api 数据验证
属性级别验证
IValidatableObject
1 public class TouristRouteForCreationDto: TouristRouteForManipulationDto//: IValidatableObject
2 {
3 //public IEnumerable<ValidationResult> Validate(
4 // ValidationContext validationContext)
5 //{
6 // if(Title == Description)
7 // {
8 // yield return new ValidationResult(
9 // "路线名称必须与路线描述不同",
10 // new[] { "TouristRouteForCreationDto" }
11 // );
12 // }
13 //}
14 }
类级别的验证
ValidationAttribute
1 /// <summary>
2 /// 特性验证
3 /// </summary>
4 public class TouristRouteTitleMustBeDifferentFromDescriptionAttribute : ValidationAttribute
5 {
6 protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
7 {
8 TouristRouteForManipulationDto dto = validationContext.ObjectInstance as TouristRouteForManipulationDto;
9 if (dto!=null)
10 {
11 if (dto.Title ==dto.Description)
12 {
13 return new ValidationResult(
14 "路线名称必须与路线描述不同",
15 new[] { "TouristRouteForCreationDto" }
16 );
17 }
18 }
19 return ValidationResult.Success;
20 }
21 }
使用
特性注入
[TouristRouteTitleMustBeDifferentFromDescriptionAttribute]
1 [TouristRouteTitleMustBeDifferentFromDescriptionAttribute]
2 public abstract class TouristRouteForManipulationDto
3 {
4 [Required(ErrorMessage = "title 不可为空")]
5 [MaxLength(100)]
6 public string Title { get; set; }
7 [Required]
8 [MaxLength(1500)]
9 public virtual string Description { get; set; }
10 // 计算方式:原价 * 折扣
11 public decimal Price { get; set; }
12 //public decimal OriginalPrice { get; set; }
13 //public double? DiscountPresent { get; set; }
14 public DateTime CreateTime { get; set; }
15 public DateTime? UpdateTime { get; set; }
16 public DateTime? DepartureTime { get; set; }
17 public string Features { get; set; }
18 public string Fees { get; set; }
19 public string Notes { get; set; }
20 public double? Rating { get; set; }
21 public string TravelDays { get; set; }
22 public string TripType { get; set; }
23 public string DepartureCity { get; set; }
24 public ICollection<TouristRoutePictureForCreationDto> TouristRoutePictures { get; set; }
25 = new List<TouristRoutePictureForCreationDto>();
26 }
最后设置统一返回 数据验证失败的提示 数据验证错误提示状态码为422不是400
1 builder.Services.AddControllers().ConfigureApiBehaviorOptions(options =>
2 {
3 //ModelState数据验证报错统一返回格式
4 options.InvalidModelStateResponseFactory = context =>
5 {
6 var problemDetail = new ValidationProblemDetails(context.ModelState)
7 {
8 Type = "无所谓",
9 Title = "数据验证失败",
10 Status = StatusCodes.Status422UnprocessableEntity,//数据验证失败需要将400转换422
11 Detail = "请看详细说明",
12 Instance = context.HttpContext.Request.Path
13 };
14 problemDetail.Extensions.Add("traceId", context.HttpContext.TraceIdentifier);
15 return new UnprocessableEntityObjectResult(problemDetail)
16 {
17 ContentTypes = { "application/problem+json" }
18 };
19 };
20 });
测试数据验证失败 返回的422状态码