【问题标题】:ASP.NET Web API decimal validationASP.NET Web API 十进制验证
【发布时间】:2013-07-05 19:39:17
【问题描述】:

我们有以下

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 属性,它可以让我返回更多用户友好的错误 消息。

【问题讨论】:

    标签: c# .net asp.net-web-api


    【解决方案1】:

    Web API 框架将“dasd”绑定到十进制,但由于无法将“dasd”转换为十进制而失败。显然,绑定必须在验证之前发生。如果您将十进制更改为字符串,则绑定将正常,您的正则表达式验证将运行并且 ModelState 将无效,但在这种情况下,您不希望出现的前缀也会出现。

    DefaultBodyModelValidatorValidate方法有这个keyPrefix参数,用来创建前缀。不幸的是,这个方法没有被标记为虚拟的,你可以重写。因此,您需要执行类似this 的操作(请参阅第一部分)。

    【讨论】:

      【解决方案2】:

      您可以在RegularExpression data-annotation 属性上设置错误消息。你有什么理由不能使用它吗?

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

      【讨论】:

      • 它适用于 MustBeDecimal 属性,但在尝试将值转换为十进制之前会发生一些验证,它会引发异常,这就是我收到的错误。甚至没有调用正则表达式验证。
      猜你喜欢
      • 2013-11-16
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2015-09-17
      • 2018-03-19
      相关资源
      最近更新 更多