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

最佳答案

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

DefaultBodyModelValidatorValidate 方法有这个keyPrefix 参数,用于创建前缀。不幸的是,此方法未标记为虚拟供您覆盖。所以,你需要做类似 this 的事情。 (见第一部分)。

关于c# - ASP.NET Web API 十进制验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17495838/

相关文章:

c# - MonoGame - 正确的 SpriteFont 缩放

c# - 在 C# 中导入 C++ dll

c# - 如何在 Entity Framework 中设置两个相同类型的导航属性

angularjs - 该资源不支持请求实体的媒体类型 'application/x-www-form-urlencoded'

c# - Puppeteer Sharp html 到 pdf 并启用链接

c# - 抽象类必须覆盖抽象方法?

c# - 如何制作属性(property)或其他任何东西来保存特定数据.net

c# - 如何更改 Microsoft C# 编译器错误消息的语言?

.net - 不使用类表示受限类型

c# - Elmah 不过滤/拦截 web api 上的错误