Поток управления возвращается из модели без посадки в действие контроллера - PullRequest
0 голосов
/ 30 августа 2018

У меня есть проект .NET Core. Я использую модель представления для привязки входящих данных из запроса.

В модели представления я делаю аннотацию данных [Required] проверка. Если данные для этого конкретного поля пусты, выполнение оттуда возвращается без передачи контроллеру.

Мне нужно, чтобы выполнение перешло к контроллеру, чтобы изменить ответ с моими пользовательскими сообщениями наряду с ошибками состояния модели.

Моя модель выглядит как

[Required(ErrorMessage = ErrorConstants.required)]
[StringLength(5, MinimumLength = 5, ErrorMessage = ErrorConstants.invalid)]
[RegularExpression("^[0-9]+$", ErrorMessage = ErrorConstants.incorrectInputFormat)]
public string ZipCode { get; set; }

Пример метода действия моего контроллера. Пожалуйста, руководство.

if (viewModel == null)
{
    _dictionary = _apiResponseService.SetResponse("false", ErrorConstants.nullOrIncorrect);
    return Ok(_dictionary);
}
if(!ModelState.IsValid)
{
    return Ok(_apiResponseService.SetResponse("false", ErrorConstants.invalidJson, ModelState.ToDictionary(kvp => kvp.Key.Replace("viewModel.", ""),
      kvp => kvp.Value.Errors.Select(error =>
      {
          if (error.Exception == null)
          {
              return error.ErrorMessage;
          }
          else
          {
              return string.Format(ErrorConstants.required, kvp.Key.Split('.').Last());
          }
      }).FirstOrDefault())));
}

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Новый атрибут [ApiController] имеет функцию, где

ошибки проверки автоматически вызывают ответ HTTP 400.

Скорее всего, состояние модели недействительно. Вот почему это не влияет на ваши действия.

Поведение по умолчанию отключено, когда Для свойства SuppressModelStateInvalidFilter установлено значение true. Добавить следующий код в Startup.ConfigureServices после services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

services.Configure<ApiBehaviorOptions>(options =>
{
    options.SuppressConsumesConstraintForFormFileParameters = true;
    options.SuppressInferBindingSourcesForParameters = true;
    options.SuppressModelStateInvalidFilter = true; //<-- THIS HERE
});

Таким образом, вместо полного удаления атрибута [ApiController], сохраните его и отключите это поведение по умолчанию, чтобы контроллер мог сохранить все преимущества, которые он предоставил, и все же получить возможность проверить состояние модели в действии.

Справочник Создание веб-API с помощью ASP.NET Core

0 голосов
/ 01 сентября 2018

Я нашел обходной путь для этого. В контроллере закомментируйте атрибут [ApiController] и работа завершена.

...