模型验证在ASP.NET Core 2.0中不起作用

时间:2018-03-15 13:36:27

标签: json data-annotations asp.net-core-2.0 asp.net-core-webapi model-validation

我一直在开发一个带有ASP.NET Core 2.0框架的 Web API 。为了验证模型,我使用了数据注释属性。还有一个Filter类,用于验证请求管道中的模型。此过滤器类工作正常,但它会在数据类型不同时抛出异常。

以下是我的带有验证器属性的模型类

public class MyModelClass
{        
    [RegularExpression("([1-4]+)", ErrorMessage = "{0} must be a Integer Value")]
    [Range(1, 4, ErrorMessage = "{0} must between 1 and 4")]
    [Required(ErrorMessage = "{0} is required")]
    public int Level { get; set; }    

    [DataType(DataType.DateTime, ErrorMessage = "Not a Valid date")]
    [Required(ErrorMessage = "{0} is required")]
    public DateTime Started { get; set; }
}

以下是我的验证属性类:

public class MyModelValidatorFilter: IActionFilter
{   
    public void OnActionExecuting(ActionExecutingContext context)
    {
        if (context.ModelState.IsValid)
            return;

        var errors = new Dictionary<string, string[]>();

        foreach (var err in actionContext.ModelState)
        {
            var itemErrors = new List<string>();

            foreach (var error in err.Value.Errors){
                itemErrors.Add(error.Exception.Message);
            }

            errors.Add(err.Key, itemErrors.ToArray());
        }

        actionContext.Result = new OkObjectResult(new MyResponse
        {
            Errors = errors
        });
    }
}

对于Postman中具有以下JSON对象的请求,我发现正确的错误消息并且没有异常发生

在邮递员中请求JSON对象:

{  
  "Level": 6,
  "Started": "2018-03-15T09:09:24.003Z",  
}

邮递员中的响应JSON对象:

{
"Errors": 
    {
    "Level": [
        "Level must between 1 and 4"
    ]
    }
}

但是,如果我发送的请求的数据类型无效,则表示模型属性中的验证消息未显示,而是显示异常消息。

邮递员中使用无效JSON对象的请求:

{  
  "Level": "Hello",
  "Started": "DD-MM-YYYY",  
}

在Postman中使用异常消息响应JSON对象:

{    
    "Errors": {
        "Started": [
            "Could not convert string to DateTime: DD-MM-YYYY. Path 'Started', line 6, position 25."
        ],
        "Level": [
            "Could not convert string to integer: Hello. Path 'Level', line 5, position 24."
        ]
    }
}

从错误消息中,我发现 RegularExpression和DataType.DateTime 验证程序无效。我不明白这个问题。任何人都可以让我知道为什么上面的代码不起作用。

还请给我正确的建议如何获得数据注释中说明的正确验证消息。

0 个答案:

没有答案