ASP.NET Core: глобальная обработка для отображения сообщения об исключении на текущей странице - PullRequest
0 голосов
/ 23 апреля 2019

В моем приложении есть набор ошибок, которые «ожидаются», и поэтому они не должны перенаправлять пользователя на полную страницу ошибок при их возникновении. Например, я хотел бы показать сообщение об ошибке в красном поле над текущей страницей.

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

Я попробовал пользовательское промежуточное ПО с TempData и фильтр с ModelState, но не могу понять, как на самом деле передать данные об ошибках обратно на текущую страницу.

Это работает для одной модели (установка данных об ошибках в TempData):

public async Task<IActionResult> OnPost() {
            try {
                 // methodThatThrows
            }
            catch (ApplicationError e) {
                TempData["Error"] = e.Message;
                return RedirectToPage("Current_Page");
            }
            return RedirectToPage("Other_Page");
        }

По какой-то причине это не работает (в глобальном промежуточном программном обеспечении), так как TempData пуст после завершения перенаправления. Кроме того, настройка промежуточного программного обеспечения на самом деле не работает с отображением других, более критических ошибок на странице обычной ошибки:

public class ApplicationErrorMiddleware {
        private readonly RequestDelegate _next;
        private readonly ITempDataDictionaryFactory _tempFactory;

        public ApplicationErrorMiddleware(RequestDelegate next, ITempDataDictionaryFactory tempFactory) {
            _next = next;
            _tempFactory = tempFactory;
        }

        public async Task InvokeAsync(HttpContext httpContext) {
            try {
                await _next(httpContext);
            }
            catch (ApplicationError ex) {
                HandleError(httpContext, ex);
            }
        }

        private void HandleError(HttpContext context, ApplicationError error) {
            var tempData = _tempFactory.GetTempData(context);
            tempData.Add("Error", error.Message);

            context.Response.Redirect(context.Request.Path);
        }
    }

1 Ответ

1 голос
/ 24 апреля 2019

По совету @hiiru, я прошел через дикую погоню за опциями конфигурации, чтобы найти рабочее решение.

Моей проблемой был пропущенный вызов из метода промежуточного программного обеспечения HandleError:

        private void HandleError(HttpContext context, ApplicationError error) {
            var tempData = _tempFactory.GetTempData(context);
            tempData.Add("Error", error.Message);
            tempData.Save(); // this call was missing

            context.Response.Redirect(context.Request.Path);
        }

После того, как вы получили это, темпданные отправляются с перенаправлением обратно на исходную страницу. Обратите внимание, что для этого используются временные данные на основе файлов cookie по умолчанию, поэтому никакой конкретной настройки не требуется.

Теперь это работает, но, возможно, это не лучший способ сделать это.

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