使用数据注释的无效日期的异常

时间:2016-01-06 17:43:21

标签: c# .net asp.net-web-api2 data-annotations

将Json API模型的日期属性定义为:

    [Required]
    [DataType(DataType.Date, ErrorMessage = "Invalid expiry date")]
    public DateTime ExpiryDate { get; set; }

在为ExpiryDate发布错误值时,示例:

   "ExpiryDate":"2020-02-31T00:00:00",
   "ExpiryDate":"2020-01-99T00:00:00",
   "ExpiryDate":"abc",

ModelState.Values.Errors [0] .ErrorMessage为空。相反,有一个Model异常,我无法返回API使用者,看起来很难看。

    ModelState.Values.Errors[0].Exception = {"Could not convert string to DateTime: 2020-02-31T00:00:00. Path 'CardDetails.ExpiryDate', line 13, position 39."}

我的问题是:如何使数据注释生成错误而不是异常?为什么当前数据注释没有给出错误,这不是[DataType(DataType.Date ...)的工作呢?

2 个答案:

答案 0 :(得分:1)

这里的主要问题是JSON中的DateTime值(至少根据JSON解析器)具有特定格式,而不遵循该格式是解析错误,这是当前正在发生的事情。

我认为您必须将值作为字符串,并在其上进行转换和验证。有几种选择。一个是像@erikscandola提到的自定义ValidationAttribute。另一个是在你的模型上使用imp IValidatableObject接口。

您还可以将model属性转换为字符串,只需检查控制器操作:

DateTime expiryDate;
if (!DateTime.TryParse(model.ExpiryDate, out expiryDate))
{
    ModelState.AddModelError("", string.Format(
        "The given ExpiryDate '{0}' was not valid", model.ExpiryDate));
} 

该方法取决于验证逻辑需要多少重用。

答案 1 :(得分:0)

您应该创建自定义数据注释:

public class RequiredDateTimeAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        // Here your code to check date in value
    }
}