1

我们有以下

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

4

2 回答 2

3

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

Validate方法DefaultBodyModelValidator有这个keyPrefix参数,用来创建前缀。不幸的是,这个方法没有被标记为虚拟的,你可以重写。所以,你需要做这样的事情(见第一部分)。

于 2013-07-06T02:54:11.577 回答
1

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

public class Model
{
    [Required]
    [RegularExpression(@"^\d+.\d{0,2}$",ErrorMessage = "You didn't enter a decimal!")]
    public decimal Cost { get;set; }
}
于 2013-07-05T19:43:22.620 回答