WebApi2中的RequiredAttribute和JsonSerializationException

时间:2018-11-27 01:49:05

标签: asp.net-web-api2

根据Model Validation in ASP.NET Web API,在模型验证期间,RequiredAttribute应该对丢失的不可为空的参数无效。

  

“发布中”:

     

此处,客户未指定价格或权重值。 JSON   格式化程序为缺少的属性分配默认值零。

     

模型状态有效,因为零是这些的有效值   属性。



我正在更新一段在属性上标有[Required]的代码,如下所示:

public class Thing
{
    [Required]
    public int Id { get; set; }
}

和控制器方法:

public HttpResponseMessage PutThing(Thing thing)
{
    if (ModelState.IsValid)
    {
        if (thing.Id == 0) // Create
        {}
        else // Update
        {}
    }
    else
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
    }
}

如果我调试控制器代码,则可以看到“ thing.id”设置为0,但是ModelState.IsValid为false,出现以下错误:

400 BadRequest - Thing.PutThing - {\"thing\":{\"Errors\":[{\"Exception\":{\"ClassName\":\"
Newtonsoft.Json.JsonSerializationException\",\"Message\":\"Required property 'Id' not found in JSON. Path '', line 1, position 332


我是否想知道这是如何工作的?

这似乎是基于控制器方法使用“ id”属性的方式对[Required]属性的不当使用,但我只是想知道为什么我得到的行为不同于文档怎么说。


编辑:我忘了提一下,如果我不检查ModelState.IsValid,上面的代码可以正常工作,并且看到那东西。Id为0。

1 个答案:

答案 0 :(得分:0)

[必需]表示您正在强迫客户端发送该值。在您的情况下,Web api会转换您的json并将Thing.Id初始化为0,但是客户端没有发送它,因此该模型无效。如果不想强制客户端发送Id值,请在模型中的Id顶部删除[required]。您可以做的另一件事是,要创建时从客户端发送0,而要更新时则发送另一个值。 我不知道您为什么要结合这两个动作,但是根据我的看法,您应该有单独的动作来进行创建和更新。