Я заметил ошибку проверки при изменении моего проекта 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 не показывает никаких ошибок.
Из документы:
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; }
}
Или вы можете полностью отключить анализ контекста с нулевым значением, который также вернется к старому поведению (поэтому лично я бы не рекомендовал его).
Значения свойств по умолчанию часто меняются, когда Microsoft выпускает новые библиотеки Net/Core. Вы мало что можете сделать.