.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状态码

 

posted on 2023-05-05 23:00  是水饺不是水饺  阅读(73)  评论(0)    收藏  举报

导航