RequiredAttribute и JsonSerializationException в WebApi2 - PullRequest
0 голосов
/ 27 ноября 2018

Согласно Проверка модели в ASP.NET Web API , RequiredAttribute не должен влиять на отсутствующий необнуляемый параметр во время проверки модели.

«Недостаточная публикация»:

Здесь клиент не указал значения для цены или веса.Модуль форматирования JSON присваивает отсутствующим свойствам значение по умолчанию, равное нулю.

Состояние модели является допустимым, поскольку для этих свойств установлено значение ноль.



Я обновляю фрагмент кода, для которого [Обязательное] помечено в свойстве следующим образом:

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


Я что-то упустил из-за того, как это работает?

Кажется, что это неправильное использование атрибута [Required], основанного на том, как метод контроллера использует свойство id в любом случае, но я просто хотел бы знать, почему у меня другое поведениечем то, что говорят документы.


РЕДАКТИРОВАТЬ: я забыл упомянуть, что, если я не проверяю ModelState.IsValid, приведенный выше код работает нормально, и видит эту вещь. Идентификатор равен 0.

1 Ответ

0 голосов
/ 27 ноября 2018

[Обязательно] означает, что вы заставляете клиента отправлять это значение.В вашем случае Web API конвертирует ваш json и инициализирует Thing.Id в 0, но клиент не отправил его, поэтому модель недействительна.Если вы не хотите принудительно отправлять клиенту значение Id, удалите [обязательный] поверх Id в модели.Другая вещь, которую вы можете сделать, это отправить 0 от клиента, когда вы хотите создать, и другое значение, когда вы хотите обновить.Я не знаю, почему вы связываете эти два действия, но, по моему мнению, у вас должны быть отдельные действия для создания и обновления.

...