Массив создает ошибку проверки в ASP.NET 6

Я заметил ошибку проверки при изменении моего проекта WebApi для использования .NET 6 вместо .NET Core 3.1 для типов параметров запроса массива. Раньше они не возвращали ошибку проверки, но с 6.0 они возвращаются.

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

public class Query
{
    public List<string> Id { get; set; }
}

И контроллер со следующей конечной точкой:

[HttpGet()]
public IActionResult Get([FromQuery] Test2 test)
{
    return Ok()
}

Когда я отправляю запрос без каких-либо параметров запроса, я получаю BadRequest, помечающий идентификатор поля как требуемый, при реализации с использованием .NET 6. При использовании .NET Core 3.1 (или 5.0) метод выполняется правильно.

Для воспроизведения я создал проект ASP.NET Core WebApi с .NET Core 3.1, 5.0 и 6.0 и добавил конечную точку контроллера с Query-Entity, содержащей массив строк, как в приведенном выше примере, без каких-либо других изменений.

Честно говоря, я немного озадачен этим. Я попытался выполнить валидатор для System.ComponentModel вручную, но это дало ожидаемый результат (без ошибок). Я не добавлял в скаффолд ничего, что объясняло бы такое поведение, в основном оно идентично. Я не нашел упоминания об этом и в списке критических изменений для .NET 6.0.

Добавление пользовательского атрибута проверки ("NotRequired") к свойству Id исправляет поведение, однако я бы предпочел иметь возможность сохранить модель запроса как есть, как она работала ранее, и ComponentModel не показывает никаких ошибок.

Значения свойств по умолчанию часто меняются, когда Microsoft выпускает новые библиотеки Net/Core. Вы мало что можете сделать.

jdweng 21.03.2022 13:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из документы:

The validation system treats non-nullable parameters or bound properties as if they had a [Required(AllowEmptyStrings = true)] attribute. By enabling Nullable contexts, MVC implicitly starts validating non-nullable properties or parameters as if they had been attributed with the [Required(AllowEmptyStrings = true)] attribute.

Вы можете сделать свойство ссылочным типом, допускающим значение NULL, чтобы сделать Id необязательным:

public class Query
{
    public List<string>? Id { get; set; }
}

Или вы можете полностью отключить анализ контекста с нулевым значением, который также вернется к старому поведению (поэтому лично я бы не рекомендовал его).

Другие вопросы по теме