Возвратите объект данных с BadRequestResult / BadRequestErrorMessageResult

Я хотел бы вернуть объект данных, содержащий сведения об ошибке, с помощью объекта BadRequestErrorMessageResult или BadRequestErrorMessageResult, например:

public IHttpActionResult Action(Model model)
{
  var validationResult = model.Validate();
  if (validationResult.Successful)
  {
    // this one's okay; it supports sending data with a 200
    return Ok(validationResult);
  }
  else
  {
    // However, how do I return a custom data object here
    // like so?
    // No such overload, I wish there was

    // return BadRequest(validationResult);
  }
}

Всего три перегрузки метода ApiController.BadRequest():

1. BadRequest();
2. BadRequest(string message);
3. BadRequest(ModelStateDictionary modelState);

Даже с № 3 словарь состояния модели представляет собой в конечном итоге глубокую коллекцию с одним слоем на другом, в нижней части которой, тем не менее, находится куча KeyValuePair<string, ModelError>, где каждый ModelError также имеет только объект string или Exception.

Следовательно, даже с # 3 мы можем упаковать только string для отправки, а не пользовательский объект, как я хочу.

Я на самом деле не спрашиваю, как я могу работать над хаком или кладжем в этой ситуации. Мой вопрос: есть ли перегрузка или другой способ, встроенный в .NET API, для отправки объекта клиенту с кодом состояния HTTP Неверный запрос?

Я использую ASP.NET Web API версии 5.2.4, ориентированной на .NET Framework версии 4.6.1.

возьмите свой пользовательский объект, сериализуйте его и используйте вторую перегрузку, чтобы вернуть его.

Andrei Dragotoniu 19.02.2019 09:10

@AndreiDragotonu Спасибо. Это одна из вещей, которые я уже обдумываю, если нет способа, встроенного в .NET framework.

Water Cooler v2 19.02.2019 09:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
3 570
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете построить/отформатировать строку в формате JSON, передать ее как строку в параметре BadRequest() и снова преобразовать ее в JSON или любой объект на бэкэнде вызывающей стороны.

Не пробовал, но должно сработать.

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

Для этого можно использовать метод Content<T>(...). Он возвращает NegotiatedContentResult, который сериализуется в зависимости от заголовков запроса (например, json, xml) и позволяет указать HttpStatusCode.

Вы можете использовать его следующим образом:

return Content(HttpStatusCode.BadRequest, myObject);

Если вы хотите, вы можете создать свой собственный метод BadRequest<T>(T obj) в контроллере в качестве оболочки, чтобы затем вы могли вызывать его, как хотите:

public IHttpActionResult BadRequest<T>(T obj)
{
    return Content(HttpStatusCode.BadRequest, obj);
}

public IHttpActionResult Action()
{
    // do whatever validation here.
    var validationResult = Validate();

    // then return a bad request
    return BadRequest(validationResult);
}

Вау! только что попробовал это в примере проекта, и он работает. Почему я не посмотрел? Большое спасибо.

Water Cooler v2 01.07.2019 08:57

Не беспокойтесь, я только что нашел его сам, потому что у меня была похожая проблема! Я пытался делать всевозможные запутанные вещи, прежде чем наткнулся на этот метод.

Zac Faragher 01.07.2019 09:03

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