c# - 在 WebApi 的 Asp Core 2.2 中创建自定义返回错误验证
问题描述
我需要在 WebApi 的 Asp Core 2.2 中创建创建自定义返回验证。
第一步 :
我创建一个OnResultExecuting
:
public override void OnResultExecuting(ResultExecutingContext context)
{
if (context.Result is BadRequestObjectResult badRequestObjectResult)
{
var message = badRequestObjectResult.Value.ToString();
if (badRequestObjectResult.Value is SerializableError errors)
{
var errorMessages = errors.SelectMany(p => (string[])p.Value).Distinct();
message = string.Join(" | ", errorMessages);
}
context.Result = new JsonResult(new ReturnResult(false, ResultStatus.BadRequest, message))
{ StatusCode = badRequestObjectResult.StatusCode };
}
}
第二步:
我创建IValidatableObject
一个UserDto
:
public class UserDto : IValidatableObject
{
[Required]
public string Name { get; set; }
[Required]
public string Family { get; set; }
[Required]
public string Password { get; set; }
[Required]
public string Username { get; set; }
[Required]
public string Email { get; set; }
[Required]
public string Phone { get; set; }
[Required]
public GenderType Gender { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
foreach (var item in ValidateList.UsernameBanList)
if (Username.Equals(item, StringComparison.OrdinalIgnoreCase))
yield return new ValidationResult("Username Invalid", new[] { nameof(Username) });
foreach (var item in ValidateList.PasswordBanList)
if (Password.Equals(item, StringComparison.OrdinalIgnoreCase))
yield return new ValidationResult("Password Invalid, new[] { nameof(Password) });
foreach (var item in ValidateList.EmailBanList)
if (Email.Equals(item, StringComparison.OrdinalIgnoreCase))
yield return new ValidationResult("Email Invalid", new[] { nameof(Email) });
}
}
第三步:
我创建一个ReturnResult
类:
public class ReturnResult
{
public bool Success { get; }
public ResultStatus Status { get; }
public string Message { get; }
public ReturnResult(bool Success, ResultStatus Status, string Message = null)
{
this.Success = Success;
this.Status = Status;
this.Message = Message ?? Status.ToDisplay();
}
#region implicit operator
public static implicit operator ReturnResult(OkResult result)
{
return new ReturnResult(true, ResultStatus.Success);
}
public static implicit operator ReturnResult(BadRequestResult result)
{
return new ReturnResult(false, ResultStatus.BadRequest);
}
public static implicit operator ReturnResult(BadRequestObjectResult result)
{
var message = result.ToString();
if (result.Value is SerializableError error)
{
var errorMessage = error.SelectMany(p => (string[])p.Value).Distinct();
message = string.Join(" | ", errorMessage);
}
return new ReturnResult(false, ResultStatus.BadRequest, message);
}
public static implicit operator ReturnResult(ContentResult result)
{
return new ReturnResult(true, ResultStatus.Success, result.Content);
}
public static implicit operator ReturnResult(NotFoundResult result)
{
return new ReturnResult(false, ResultStatus.NotFound);
}
#endregion
}
现在全部以这种格式返回 Api :
{
"success": true,
"status": 0,
"message": "success process"
}
在UserDto
我为用户名和密码以及电子邮件创建一个验证然后我需要返回它们的所有错误以这种格式返回:
{
"success": true,
"status": 0,
"message": "Email Invalid | Password Invalid | Username Invalid"
}
但它没有以这种格式向我展示,它向我展示了这种格式:
{
"success": false,
"status": 2,
"message": "Microsoft.AspNetCore.Mvc.ValidationProblemDetails"
}
我怎么解决这个问题 ????
解决方案
试试看:
public static implicit operator ReturnResult(BadRequestObjectResult result)
{
System.Reflection.PropertyInfo pi = result.Value.GetType().GetProperty("Errors");
Dictionary<string, string[]> errors = (Dictionary<string, string[]>)(pi.GetValue(result.Value, null));
var message = result.ToString();
var errorMessage = error.SelectMany(p => p.Value).Distinct();
message = string.Join(" | ", errorMessage);
return new ReturnResult(false, ResultStatus.BadRequest, message);
}
推荐阅读
- python - googletrans - 获得与输入相同的输出
- apache-kafka - Kafka 消费者是否收到已刷新(fsynched)到磁盘的消息?
- android - 如何拥有具有恒定提示和图标以及可编辑提示的编辑文本?
- kivymd - kivymd 0.104.2dev:MDGridBottomSheet 项目调用回调函数两次
- node.js - 将 Express 应用程序部署到 Azure 应用程序服务没有响应端口上的 HTTP ping:8080
- java - 处理(Java):当函数的幅度增加时,如何使绘制的正弦函数看起来是连续的而不是单独的点
- css - 仅在 CSS 中具有“3 列和 4 个状态”的网站
- android - 从 Google Play 首次安装时未运行 Android 房间迁移
- javascript - Chrome contenteditable=false in contenteditable=true 输入中文问题
- oauth-2.0 - oauth2 中的资源所有者密码授予流程是否有其他替代方法?