Проверка данных веб-API ASP.NET Core 8 игнорирует аннотации данных

Я пытаюсь заставить автоматическую проверку данных работать в ApiController, но когда пользователь отправляет неправильные/отсутствующие данные, вместо пользовательского ErrorMessage возвращается сообщение об ошибке десериализации JSON.

Профиликонтроллер.cs

using ClassLibrary.Models;
using ClassLibrary.Services;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
using ClassLibrary.Models.API.Responses.Profiles;
using ClassLibrary.Models.API.Requests;
using Microsoft.AspNetCore.Authorization;

namespace API.Controllers
{
    [ApiController]
    [Route("v1/[controller]")]
    public class ProfilesController : Controller
    {
        private IProfileManager _profileManager;

        public ProfilesController(IProfileManager profileManager)
        {
            _profileManager = profileManager;
        }

        [Authorize]
        [HttpPatch("about")]
        public async Task<IActionResult> UpdateAbout([FromBody] UpdateAboutPayload payload)
        {
            await _profileManager.UpdateAboutAsync(payload.About);

            return Ok();
        }
    }
}

ОбновлениеAboutPayload.cs

using System.ComponentModel.DataAnnotations;

namespace ClassLibrary.Models.API.Requests
{
    public class UpdateAboutPayload
    {
        [Required(ErrorMessage = "About is required")]
        [StringLength(500, ErrorMessage = "About must be between 0 and 500 characters long")]
        public required string About { get; set; }
    }
}

Когда я отправляю следующие данные

{}

Я получаю эту ошибку

{
  "type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "errors": {
    "$": [
      "JSON deserialization for type 'ClassLibrary.Models.API.Requests.UpdateAboutPayload' was missing required properties, including the following: about"
    ],
    "payload": [
      "The payload field is required."
    ]
  },
  "traceId": "00-402c938fa2cb172de6a89b521f8fcae1-88ebfe9d6c674e35-00"
}

вместо сообщения об ошибке, настроенного в атрибуте [Required]

Стоит ли изучать 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
0
252
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это правильное поведение, вы не отправляете весь объект, поэтому вы получаете исключение, требующее поле полезных данных. Если вам нужно только сообщение «О необходимости», вам нужно отправить пустую полезную нагрузку, что-то вроде этого

{ 
   payload: {} 
}

About — это строка, а не объект, и даже если я установлю для нее пустой объект, я все равно получаю то же сообщение об ошибке.

iKingNinja 23.04.2024 23:56

Означает ли это, что [FromBody] пытается извлечь дочернее свойство с ключом payload изнутри вашего объекта JSON тела верхнего уровня вместо того, чтобы рассматривать весь объект JSON тела как сам объект UpdateAboutPayload? Может быть, удаление [FromBody] приведет к анализу всего тела как этого класса? (Случай 6 в Приоритет привязки)

Ben Hutchison 24.04.2024 00:01

Проблема по-прежнему возникает даже без атрибута [FromBody].

iKingNinja 24.04.2024 02:11
Ответ принят как подходящий

Проблема была вызвана модификатором required свойства About, его удаление решило проблему.

Это не решает вашу проблему, а просто скрывает ее.

Pankaj 24.04.2024 12:26

Как это не решает мою проблему? Значение по-прежнему является обязательным, но оно устанавливается атрибутом [Required], а не модификатором required.

iKingNinja 24.04.2024 12:35

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