C# 在WebApi的Asp Core 2.2中创建自定义返回错误验证

C# 在WebApi的Asp Core 2.2中创建自定义返回错误验证,c#,asp.net,asp.net-core,asp.net-core-webapi,C#,Asp.net,Asp.net Core,Asp.net Core Webapi,我需要在WebApi的Asp Core 2.2中创建一个创建自定义返回验证 第一步: 我在OnResultExecuting上创建一个 public override void OnResultExecuting(ResultExecutingContext context) { if (context.Result is BadRequestObjectResult badRequestObjectResult) { var message = bad

我需要在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 };
        }
}
第二步

我在
UserDto
中创建了一个
IValidatableObject

 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) });
    }
}
现在所有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);
        }
公共静态隐式运算符ReturnResult(BadRequestObjectResult)
{
System.Reflection.PropertyInfo pi=result.Value.GetType().GetProperty(“错误”);
字典错误=(字典)(pi.GetValue(result.Value,null));
var message=result.ToString();
var errorMessage=error.SelectMany(p=>p.Value).Distinct();
message=string.Join(“|”,errorMessage);
返回新的ReturnResult(false,ResultStatus.BadRequest,消息);
}

是否有任何演示来重现您的问题?我用你的代码做了一个测试,它工作正常,请检查。尝试逐行调试代码,查看它返回的位置
Microsoft.AspNetCore.Mvc.ValidationProblemDetails
。可能是badRequestObjectResult.Value.ToString()返回“Microsoft.AspNetCore.Mvc.ValidationProblemDetails”,以及未执行的下一个if条件。最好说出你在控制器中写的内容
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);
        }