制定數據驗證規則,盡量在Dto中創建數據驗證
ModelState是ASP.NET CORE內建的全局變量 ,用來進行數據驗證,本質上 ModelState 是一個鍵值對類型的結構,包含當前數據模型狀態,以及該模型相應的數據驗證邏輯 通過調用ModelState.IsValid來提取驗證結果 如果驗證失敗 ModelState還會提供驗證失敗的詳細信息
1、數據注釋 DataAnnotation
使用方式 :給要添加的數據驗證的屬性加上特性即可
如圖 DataAnnotations 里面帶有Attrbute屬性都可以直接使用特性的方式對數據進行驗證
[MaxLength(100,ErrorMessage ="標題不能超過100個字符")]
[Required(ErrorMessage ="標題必填")]
2、自定義數據驗證規則(屬性級別)
實現IValidatableObject接口Validate 在這個方法中可以對數據驗證作補充
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Title== Description)
{
yield return new ValidationResult
(
"標題不能和詳細信息一樣",//錯誤信息
new[] { "TouristRouteCreationDto" } //錯誤路徑
);
}
}
3、完成class級別的數據驗證
1)新建 名為 ValidationAttrbutes文件夾 這個文件夾專門用來存放用於驗證數據的 Attribute
2)在此文件下下新建 Attrbute類 繼承 ValidationAttibute IsValid方法 具體實現如下
public class TouristRouteTitleMustBeDifferentFromDescriptionAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(
object value, //需要驗證的數據對象
ValidationContext validationContext //驗證的上下文關系對象
)
{
var touristRouteDto =(TouristRouteDto) validationContext.ObjectInstance;//通過上下文關系對象,獲得需要驗證(當前的)的對象
if (touristRouteDto.Title==touristRouteDto.Description)
{
return new ValidationResult(
"標題不能和詳細信息一樣",//錯誤信息
new[] { "TouristRouteCreationDto" } //錯誤路徑
);
}
return ValidationResult.Success;
}
}
3)使用特性
4、一般數據驗證失敗沒有對返回體進行配置的話,返回的狀態碼400,但是數據驗證失敗的狀態碼是422,這需要在startup.cs文件進行配置
如下
services.AddControllers(
setupAction =>
{
setupAction.ReturnHttpNotAcceptable = true;//所有api都回復默認的數據結構 json 這里的默認值是false
//setupAction.OutputFormatters.Add(
// new XmlDataContractSerializerOutputFormatter()
// );//配置數據的輸出格式
}
).AddXmlDataContractSerializerFormatters()
.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);//添加追蹤ID
return new UnprocessableEntityObjectResult(problemDetail)
{
ContentTypes = { "application/problem+json" }
};
};
});