如何确定哪个ValidationAttribute返回了ModelError

Sca*_*lam 6 c# validation attributes modelstate action-filter

我遇到了一个问题,我正在尝试确定哪个ValidationAttribute返回了特定的ModelError.我的web api中有一个端点,它采用的模型如:

public class MyClass
{
    [Required]
    [Range(0, 3)]
    public int? Number { get; set; }

    [Required]
    [Range(0, 3)]
    public int? NumberTwo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以及用于检查ModelState是否有效的过滤器;

public class ValidateModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!actionContext.ModelState.IsValid)
        {
            IEnumerable<ModelError> errors = actionContext.ModelState.Values.SelectMany(s => s.Errors);
            // ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我看到ModelError有两个属性; ErrorMessage是string类型,Exception是Exception类型.我想要一种强类型的方法来确定哪个ValidationAttribute [Required]或[Range(0,3)]返回错误响应而不进行字符串操作.有没有办法使用我不熟悉的这些属性返回自定义属性?

如果客户要发布一个模型,如

{
    "NumberTwo":10
}
Run Code Online (Sandbox Code Playgroud)

最终目标是从API产生响应,如下所示;

{
    "supportCode" : "1234567890",
    "errors" : [{
        "code" : "Missing",
        "message" : "The Number field is required."
    }, {
        "code" : "Invalid",
        "message" : "The field NumberTwo must be between 0 and 3."
    }] 
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*len 0

如果您编写自己的验证例程而不是使用 MVC 中内置的验证例程,则这是可能的。您需要对每个属性使用反射,然后对每个属性的每个验证属性使用反射。