C# ASP.NET Web API十进制验证

C# ASP.NET Web API十进制验证,c#,.net,asp.net-web-api,C#,.net,Asp.net Web Api,我们有以下几点 public class Model { [Required] public decimal Cost { get;set; } } 当我们收到一个无效值,如“dasd”或其他任何值时,我返回一个BadRequest: public HttpResponseMessage Post(Model data) { if (!ModelState.IsValid) { return Request.CreateErrorRespon

我们有以下几点

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

您可以在
正则表达式
数据注释属性上设置错误消息。你有什么理由不能用这个吗

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

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

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

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


DefaultBodyModelValidator
Validate
方法具有此
keyPrefix
参数,用于创建前缀。不幸的是,此方法未标记为虚拟,您无法覆盖。因此,您需要执行类似的操作(参见第一部分)。

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


DefaultBodyModelValidator
Validate
方法具有此
keyPrefix
参数,用于创建前缀。不幸的是,此方法未标记为虚拟,您无法覆盖。因此,您需要执行类似的操作(请参见第一部分)。

它适用于MustBeDecimal属性,但在尝试将值转换为decimal之前会发生一些验证,它会引发异常,这就是我收到的错误。正则表达式验证甚至没有被调用。它可以用于MustBeDecimal属性,但在尝试将值转换为十进制之前,会发生一些验证,它会抛出一个异常,这就是我收到的错误。甚至没有调用正则表达式验证。