我一直在开发一个带有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 验证程序无效。我不明白这个问题。任何人都可以让我知道为什么上面的代码不起作用。
还请给我正确的建议如何获得数据注释中说明的正确验证消息。