Как вернуть исходный вид из IExceptionFilter.OnException () - PullRequest
0 голосов
/ 08 мая 2019

У меня есть приложение ASP.NET Core MVC, которое вызывает ASP.NET Core Web API для некоторых данных.Веб-API может возвращать ответ «Плохой запрос» с ошибками состояния модели, и я хочу автоматически обрабатывать неправильный запрос и отображать ошибки состояния модели, поступающие из веб-API, в моем представлении MVC.

Я попытался написать исключениеФильтр для этого, но я не уверен, как сказать фильтру исключений для отображения представления, вызвавшего исключение.

public class WebApiExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // My web API client will throw a WebApiException if it doesn't produce a successful response
            if (context.Exception is WebApiException webApiEx)
            {
                switch (webApiEx.StatusCode)
                {
                    case StatusCodes.Status400BadRequest:
                        context.ModelState.AddJsonModelErrors(webApiEx.Response); // This method de-serialises the model state from the web API response
                                                                                  // and adds it to the MVC model state
                        context.ExceptionHandled = true;
                        return;
                }
            }
        }
    }

Как я могу получить фильтр исключений, чтобы вернуть представление, в котором произошло исключение, такЯ могу отобразить ошибки модели?Или, альтернативно, есть ли лучший способ сделать это?Я не хочу пытаться поймать каждый вызов веб-API, который я выполняю в действиях MVC.

1 Ответ

0 голосов
/ 08 мая 2019

Для замены вида вы можете попробовать следующий код:

public class WebApiExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext context)
    {
        // My web API client will throw a WebApiException if it doesn't produce a successful response
        if (context.Exception is WebApiException webApiEx)
        {
            switch (webApiEx.StatusCode)
            {
                case StatusCodes.Status400BadRequest:
                    ViewDataDictionary viewData = new ViewDataDictionary(new EmptyModelMetadataProvider(),
                        context.ModelState);
                    context.ModelState.AddJsonModelErrors(webApiEx.Response); // This method de-serialises the model state from the web API response
                                                                              // and adds it to the MVC model state
                    viewData.Model = new Product(); //replace it with your model from WebApiException
                    context.Result = new ViewResult() {
                        ViewName = "Create", //replace it with your real view from WebApiException
                        ViewData = viewData,
                    };

                    context.ExceptionHandled = true;
                    return;
            }
        }
    }
}

Для этого вам необходимо настроить Model и ViewName.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...