ASP.NET Web API十进制验证

本文关键字:十进制 验证 API Web NET ASP | 更新日期: 2023-09-27 18:21:08

我们有以下

public class Model
{
    [Required]
    public decimal Cost { get;set; }
}

当我们收到一个无效的值,比如"dasd"或其他任何值时,我会返回一个BadRequest:

public HttpResponseMessage Post(Model data) 
{
    if (!ModelState.IsValid) 
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
    }
    return Request.CreateResponse(HttpStatusCode.OK);
}

但在响应中,json看起来像:

{
    "message": "The request is invalid.",
    "modelState": {
        "data.cost": ["Could not convert string to decimal: dasd. Path 'cost', line 1, position 181."],
    }
}

首先,我该如何处理这些数据。前缀

此外,我想实现一个自定义验证器,比如MustBeDecimal属性,它可以让我返回更用户友好的错误消息

ASP.NET Web API十进制验证

Web API框架将"dasd"绑定到小数,但由于无法将"dasd"转换为小数,因此失败。显然,绑定必须在验证之前进行。如果您将decimal更改为string,绑定将正常,regex验证将运行,ModelState将无效,但在这种情况下,您不希望出现的前缀也将出现。

DefaultBodyModelValidatorValidate方法有这个keyPrefix参数,用于创建前缀。很遗憾,此方法未标记为虚拟以便您重写。所以,你需要做这样的事情(见第一部分)。

您可以在RegularExpression数据注释属性上设置错误消息。你为什么不能用这个?

public class Model
{
    [Required]
    [RegularExpression(@"^'d+.'d{0,2}$",ErrorMessage = "You didn't enter a decimal!")]
    public decimal Cost { get;set; }
}