我如何执行,例如使用DataAnnotations的数字约束?

时间:2014-12-01 11:09:15

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

我正在尝试使用模型状态来验证对我的WebAPI的请求,但是我在如何控制某些属性的错误消息方面遇到了一些麻烦。例如,给定以下模型

public class Stuff {

    [Range(0, Double.PositiveInfinity)]
    public double? SomeProp { get; set; }

}

(以及在帖子底部定义的一些基础结构)具有有效负载的请求(例如{ someProp: "1.2" })将正确建模绑定 - 负值或缺失值将产生错误 - 但是如果我输入的内容不是有效数字(例如{ someProp: "hello" })模型状态有错误,例如

  

将值“hello”转换为类型'System.Nullable`1 [System.Double]'时出错。路径'someStuff',第1行,第41位。

(我猜这个位置在JSON对象中,这里是一个更大的请求,所以不要介意确切的数字......)。对于另一个不可为空但又具有[Required]属性的属性,除了上述消息之外,模型状态字典中还包含有关缺少必需属性的错误消息。 / p>

我明白为什么"hello"无法绑定到double?(或double),但无论我在属性中设置的约束如何,似乎该值必须是模型绑定的甚至在它们被检查之前,如果模型绑定失败,我都会得到上面那个不那么友好的消息,以及在取消设置值时应用的所有其他错误。在尝试绑定值之前,我能够应用的唯一约束是Regex,但如果失败,我会收到类似用户不友好的消息,如

  

字段SomeProp必须与正则表达式'< my regex>'匹配。

有没有办法解决这个问题,以便在输入非数字的东西时,我可以给用户提供更好的错误信息到应该指定数值的文本框?

脚注:我的验证基础设施

[HttpPost]
[Validate]
public IHttpActionResult Validate(Stuff stuff) {
    return Ok();
}

Validate属性的定义如下:

public class ValidationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!actionContext.ModelState.IsValid)
        {
            actionContext.Response = actionContext.Request
                .CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
        }
    }
}

0 个答案:

没有答案