validation - 自定义 ASP.NET Core MVC 验证响应

标签 validation asp.net-core asp.net-core-mvc

ASP.NET Core MVC 有一个很棒的模型绑定(bind)和模型验证子系统,它支持几乎所有场景。但是在开发时 API 事情可能会更复杂一些。

假设我们有一个具有属性 XYZ 的模型类。用 [MinLength(5)] 注释.

public class ViewModel
{
    [MinLength(5)]
    public string XYZ { get; set; }
}

如果这个属性有什么问题,MVC 会给你这样的东西:
 { "XYZ": [ "The field XYZ must be a string or array type with minimum length of '5'" ] }

但这不是客户需要的!客户需要一个具有特定细节的对象。她将创建自己的信息,但她想:
{ "error": "minLength", "property": "XYZ", "minimum": 5 }

可能的解决方案:
  • 您可以使用 InvalidModelStateResponseFactory生成自定义响应。它为您提供 ActionContext其中包含 ModelState属性(property)。但是您所能做的就是处理纯字符串的错误消息!这可能会导致一些问题。
  • 另一种选择是完全禁用 MVC 验证并自己实现一个。

  • 我很欣赏任何其他解决方案。

    最佳答案

    对于一般验证消息,它是纯字符串。而对于 minLengthminimum不同的验证属性是不同的。我想知道客户端将如何检查不同的节点。

    服务器端,InvalidModelStateResponseFactory最好返回 json 对象。并且您需要检查 ValidationAttribute 以返回不同的对象,例如

    services.Configure<ApiBehaviorOptions>(o =>
    {
        o.InvalidModelStateResponseFactory = actionContext =>
        {
            var error = new Dictionary<string, string>();
            foreach (var key in actionContext.ModelState.Keys)
            {
                foreach (var parameter in actionContext.ActionDescriptor.Parameters)
                {
                    var prop = parameter.ParameterType.GetProperty(key);
                    if (prop != null)
                    {
                        var att = prop.GetCustomAttributes(typeof(ValidationAttribute), false).FirstOrDefault() as ValidationAttribute;
                        if (att is MinLengthAttribute minLengthAttribute)
                        {
                            error.Add("Error", "minLength");
                            error.Add("Property", key);
                            error.Add("minimum", minLengthAttribute.Length.ToString());    
                        }
                    }
                }
            }
            return new BadRequestObjectResult(error);
        };
    });
    

    关于validation - 自定义 ASP.NET Core MVC 验证响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57533976/

    相关文章:

    展开时未显示 WPF 展开器验证错误

    forms - Spring MVC 选择 :selected after form validation error 形式的值

    c# - 创建路由时出错

    c# - .net core classlibrary调用.net framework类库

    Angular简单模式验证问题

    ruby-on-rails - Rails 4 - 验证数组中的元素

    c# - 如何在 asp.net core 中更改根路径 ~/in Razor

    asp.net-core - 如何在 ASP.NET 5 中使用 Uri 和 QueryString

    asp.net-core - 如何在 Asp.Net Core 3.1 中启用 TLS 1.2

    c# - 获取 URL 段