模型绑定忽略具有JsonIgnore属性的属性

时间:2019-06-11 15:38:27

标签: asp.net-core asp.net-core-mvc asp.net-core-webapi asp.net-core-3.0

我正在使用Core 3构建Web api微服务。我有一个定义如下的类:

public class UserSourceList
{
    [JsonIgnore]
    public string UserId { get; set; }

    [JsonIgnore]
    public string ListId { get; set; }

    public string Name { get; set; }

    [JsonConverter(typeof(StringEnumConverter))]
    public ListTypes ListType { get; set; }

    public List<string> Ids { get; set; }

    public DateTimeOffset CreationTime { get; set; }
}

当框架尝试绑定HTTP PUT提供的数据时,它将不会填充UserIdListId字段。结果,模型绑定在验证期间失败,并返回HTTP 400,表明需要UserIdListId

控制器的动作方法定义如下:

 [HttpPut("{userId:userid}/{listId:listid}", Name = "ReplaceUserList")]
 public ActionResult Replace(string userId, string listId, UserSourceList model)
 {
    return Ok(_listManager.ReplaceUserList(model.UserId, model.ListId, model));
 }

对API的典型调用类似于以下内容:

PUT /api/v1/listmgmt/abc123def456/c788f2f7b7984424910726d4a290be26

PUT正文

{
  "name": "Test",
  "listType": "Eans",
  "ids": ["97814571867716", "9781430257615", "9780982550670"],
  "userId":"abc123def456",
  "listId":"c788f2f7b7984424910726d4a290be26"
}

如果我从模型的JsonIgnoreUserId属性中删除了ListId属性,那么一切都会按预期进行绑定。

模型绑定会忽略标记为JsonIgnore的字段吗?

我知道我可以通过更改验证代码的工作方式来解决此问题,也可以拆分模型。我想了解当前的行为,因为它与我对ASP.NET MVC 4和WebApi 2的预期和体验有所不同。

谢谢

3 个答案:

答案 0 :(得分:0)

我认为原因在于:

[HttpPut("{userId:userid}/{listId:listid}", Name = "ReplaceUserList")]

userId和listId是必需的,不能被忽略,因为它们在注释HttpPut中定义。我认为您需要从HttpPut的参数中删除它们,并找到另一种解决方法。

希望这会有所帮助!

答案 1 :(得分:0)

简短的回答是,当内容类型为application / json时,将使用Newtonsoft Json.Net反序列化发布/发布正文。因此,反序列化期间将忽略userId和listId参数,但在模型验证期间将对其进行评估。

我删除了JsonIgnore属性以及所有的数据注释,并更改为FluentValidation软件包,该软件包在运行时提供了根据调用的类型配置应如何验证正文的功能。

答案 2 :(得分:0)

您应该为此编写一个DTO类。