lwl1569  
  1. 对于单个属性的验证:
    直接在Dto的属性前加Attribute,例如Required、Required("数据不可为空,用于返回错误提示")、MaxLength(100)等。
    2、对于多个属性的验证:(属性级别验证)
    继承IValidationObject,编写Validate方法
    public class TouristRouteForCreationDto : IValidatableObject
    {
        public string Title { get; set; }
        public string Description { get; set; }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (Title == Description)
            {
                yield return new ValidationResult(
                    "路线名称必须与路线描述不同",
                    new[] { "TouristRouteForCreationDto" }
                );
            }
        }
    }

3、对于多个属性的验证:(类级别验证)
创建一个继承了ValidationAttribute的类,重写ValidationResult方法,然后在Dto中引用这个类,作为Dto类的Attribute使用。

public class TouristRouteTitleMustBeDifferentFromDescriptionAttribute: ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext
        )
        {
            var touristRouteDto = (TouristRouteForCreationDto)validationContext.ObjectInstance;
            if (touristRouteDto.Title == touristRouteDto.Description)
            {
                return new ValidationResult("路线名称必须与路线描述不同",new[] { "TouristRouteForCreationDto" });//ValidationResult的第一个参数是错误信息,第二个参数是错误路径
            }
            return ValidationResult.Success;
        }
    }

在Dto中进行引用

    [TouristRouteTitleMustBeDifferentFromDescriptionAttribute]
    public class TouristRouteForCreationDto
    {
        [Required(ErrorMessage = "title 不可为空")]
        [MaxLength(100)]
        public string Title { get; set; }
        [Required]
        [MaxLength(1500)]
        public string Description { get; set; }
        public string Pirce { get; set; }
    }

因为除了要在Dto中引用,还有可能在其他的Dto中使用,所以为了提高复用性,将与属性相关的单独成类后引用类修饰,Dto去继承这个新的类。代码如下:

public class TouristRouteTitleMustBeDifferentFromDescriptionAttribute: ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext
        )
        {
            var touristRouteDto = (TouristRouteTitleAndDescription)validationContext.ObjectInstance;//此处的强制转换类型改为TouristRouteTitleAndDescription
            if (touristRouteDto.Title == touristRouteDto.Description)
            {
                return new ValidationResult("路线名称必须与路线描述不同",new[] { "TouristRouteForCreationDto" });//ValidationResult的第一个参数是错误信息,第二个参数是错误路径
            }
            return ValidationResult.Success;
        }
    }
//新的类
[TouristRouteTitleMustBeDifferentFromDescriptionAttribute]
public class TouristRouteTitleAndDescription
{
        [Required(ErrorMessage = "title 不可为空")]
        [MaxLength(100)]
        public virtual string Title { get; set; }//virtual 表示可以在子类中被override
        [Required]
        [MaxLength(1500)]
        public virtual string Description { get; set; }
}

然后在需要的Dto中继承TouristRouteTitleAndDescription

    public class TouristRouteForCreationDto: TouristRouteTitleAndDescription
    {
        public string Pirce { get; set; }
    }

422状态码注入(非法模型状态响应工厂)
在services.AddControllers()后配置ConfigureApiBehaviorOptions服务。

            services.AddControllers()
            .ConfigureApiBehaviorOptions(setupAction => 
            {
                setupAction.InvalidModelStateResponseFactory = context =>
                {
                    var problemDetail = new ValidationProblemDetails(context.ModelState)
                    {
                        Type = "无所谓",
                        Title = "数据验证失败",
                        Status = StatusCodes.Status422UnprocessableEntity,
                        Detail = "请看详细说明",
                        Instance = context.HttpContext.Request.Path
                    };
                    problemDetail.Extensions.Add("traceId", context.HttpContext.TraceIdentifier);
                    return new UnprocessableEntityObjectResult(problemDetail)
                    {
                        ContentTypes = { "application/problem+json" }
                    };
                };
            });
posted on 2021-09-26 20:30  lwl1569  阅读(149)  评论(0)    收藏  举报