Привязка модели игнорирует свойства, имеющие атрибут JsonIgnore - PullRequest
0 голосов
/ 11 июня 2019

Я создаю микросервис веб-API с использованием Core 3. У меня есть класс, определенный следующим образом:

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, она будетне заполняет поля UserId и ListId.В результате привязка модели завершается ошибкой во время проверки и возвращает HTTP 400, в котором говорится, что требуются UserId и ListId.

Метод действия контроллера определяется следующим образом:

 [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 Body

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

Если я удалил атрибут JsonIgnore из UserId и ListId свойств модели, все связывается, как и ожидалось.

Ожидается ли поведение, что привязка модели будет игнорировать поля, помеченные JsonIgnore?

Я знаю, что могу обойти этоизменив, как работает мой код проверки, или я могу разделить свою модель.Я хотел бы понять текущее поведение, поскольку оно отличается от того, что я ожидал и испытал с ASP.NET MVC 4 и WebApi 2.

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Краткий ответ: Newtonsoft Json.Net используется для десериализации тела записи / размещения, когда тип контента - application / json.Поэтому параметры userId и listId игнорируются во время десериализации, но оцениваются во время проверки модели.

Я удалил атрибут JsonIgnore, а также все аннотации данных и изменил его на пакет FluentValidation, который предоставлял возможность во время выполнения.настроить способ проверки тела на основе типа сделанного вызова.

0 голосов
/ 11 июня 2019

Я думаю, что причина в этом:

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

userId и listId являются обязательными и не могут быть проигнорированы, поскольку они определены в аннотации HttpPut. Я думаю, вам нужно удалить их из параметров HttpPut и найти другой способ обойти это.

Надеюсь, это поможет!

...