首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RequiredAttribute与JsonSerializationException in WebApi2

RequiredAttribute与JsonSerializationException in WebApi2
EN

Stack Overflow用户
提问于 2018-11-27 01:49:04
回答 1查看 47关注 0票数 0

根据ASP.NET Web中的模型验证的说法,在模型验证期间,RequiredAttribute不应该对缺少的非空参数产生影响。

“未邮寄”: 在这里,客户端没有为价格或重量指定值。JSON格式化程序为缺失的属性分配默认值为零。 模型状态是有效的,因为零是这些属性的有效值。

我正在更新一段需要在属性上标记的代码,如:

代码语言:javascript
复制
public class Thing
{
    [Required]
    public int Id { get; set; }
}

而控制器方法:

代码语言:javascript
复制
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,有以下错误:

代码语言:javascript
复制
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“属性的方式,这似乎是对所需属性的不当使用,但我只想知道为什么我得到的行为与文档所说的不同。

编辑:我忘了提到,如果我不检查ModelState.IsValid,上面的代码可以正常工作,并看到thing.Id是0。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-27 04:10:56

必需意味着您正在强制客户端发送该值。在您的示例中,Web将json转换为0并将Thing.Id初始化为0,但它不是由客户端发送的,因此模型无效。如果不希望强制客户端发送Id值,请删除模型中Id顶部所需的Id值。您可以做的另一件事是,当您想要创建时,从客户端发送0,当您想要更新时,发送不同的值。我不知道为什么要耦合这两个操作,但根据我的说法,您应该有单独的创建和更新操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53491619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档