Могу ли я перехватывать определенные c исключений глобально на странице Razor (все методы обработчика) и включать их в ModelState? - PullRequest
0 голосов
/ 29 мая 2020

Я хотел бы разрешить всем методам-обработчикам на странице Razor быть обернутыми каким-то логическим c для обработки определенных c исключений, которые являются более или менее исключениями проверки.

I ' Мы пробовали следующее, но все равно получили страницу исключения разработчика:

    public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
    {
        try
        {
            await next();
        }
        catch(NotImplementedException ex)
        {
            _logger.LogWarning(ex, ex.Message);
            ModelState.AddModelError(string.Empty, "Oops... this isn't all done yet.");
            context.Result = Page();
        }
        catch (DomainValidationException ex)
        {
            ModelState.Include(ex.Results);
            context.Result = Page();
        }  
    }

Исключение не возникает из-за вызова await next() и каким-то образом обрабатывается в aspnetcore.

1 Ответ

0 голосов
/ 29 мая 2020

Оказывается, next возвращает результат, который необходимо проверить, чтобы получить исключение и вернуть результат.

Окончательная реализация выглядит примерно так:

public override async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
{
    var result = await next();

    if (result.Exception != null)
    {
        if (result.Exception is NotImplementedException nex)
        {
             result.ExceptionHandled = true;
            _logger.LogWarning(nex, nex.Message);
            ModelState.AddModelError(string.Empty, "Oops... this isn't all done yet.");
        }
        else if (result.Exception is DomainValidationException dex)
        {
            result.ExceptionHandled = true;
            ModelState.Include(dex.Results);
        }

        if (result.ExceptionHandled)
        {
            result.Result = Page();
        }
    }
}
...