Я пытаюсь заставить автоматическую проверку данных работать в 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]
Это правильное поведение, вы не отправляете весь объект, поэтому вы получаете исключение, требующее поле полезных данных. Если вам нужно только сообщение «О необходимости», вам нужно отправить пустую полезную нагрузку, что-то вроде этого
{
payload: {}
}
Означает ли это, что [FromBody]
пытается извлечь дочернее свойство с ключом payload
изнутри вашего объекта JSON тела верхнего уровня вместо того, чтобы рассматривать весь объект JSON тела как сам объект UpdateAboutPayload
? Может быть, удаление [FromBody]
приведет к анализу всего тела как этого класса? (Случай 6 в Приоритет привязки)
Проблема по-прежнему возникает даже без атрибута [FromBody]
.
Проблема была вызвана модификатором required
свойства About
, его удаление решило проблему.
Это не решает вашу проблему, а просто скрывает ее.
Как это не решает мою проблему? Значение по-прежнему является обязательным, но оно устанавливается атрибутом [Required]
, а не модификатором required
.
About — это строка, а не объект, и даже если я установлю для нее пустой объект, я все равно получаю то же сообщение об ошибке.