- 对于单个属性的验证:
直接在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" }
};
};
});

浙公网安备 33010602011771号