Вернуть существующее бритвенное представление из промежуточного ПО в ядре asp.net - PullRequest
0 голосов
/ 06 ноября 2018

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

E.g Когда Account/Add выдает SqlException, я возвращаю Account/Add ответ с сообщением, которое хранится в TempData из промежуточного программного обеспечения исключения. я уже все эти движки вида сделали.

Я нашел этот метод расширения и использование для этой цели, с этим вы можете вернуть все реализации IActionResult из промежуточного программного обеспечения, большое расширение. Однако я не смог выяснить, как вернуть свое обычное представление, которое находится в моей папке представлений, например Views/Account/Add

Промежуточное ПО исключений

private readonly RequestDelegate _next;

public ExceptionHandler(RequestDelegate next)
{
    _next = next;
}
public async Task Invoke(HttpContext context)
{
    try
    {
        await _next.Invoke(context);
    }
    catch (Exception ex)
    {
        HandleException(context, ex);
    }
}

private void HandleException(HttpContext context, Exception exception)
{
    //handle exception, log it and other stuff...
    //....

    var result = new ViewResult
    {
        ViewName = context.Request.Path.ToString(),
    };
    //WithDanger is an extension method writes message to tempdata
    result.WithDanger("Error", exception.ToString());

    //Extension method
    context.WriteResultAsync(result);
}

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

Как я могу заставить мое промежуточное ПО возвращать ViewResult с моим существующим видом?

1 Ответ

0 голосов
/ 06 ноября 2018

Там пара вещей отсутствует. Чтобы вернуть представление с использованием относительного пути, вам необходимо обрезать начальную косую черту:

ViewName = context.Request.Path.ToString().TrimStart('/')

Вы также не ожидаете звонка WriteResultAsync. Измените его на что-то вроде

private TaskHandleException(HttpContext context, Exception exception)
{
    //handle exception, log it and other stuff...
    //....

    var result = new ViewResult
    {
        ViewName = context.Request.Path.ToString().TrimStart('/'),
    };
    //WithDanger is an extension method writes message to tempdata
    result.WithDanger("Error", exception.ToString());

    //Extension method
    return context.WriteResultAsync(result);
}

И убедитесь, что вы ожидаете звонка на HandleException:

public async Task Invoke(HttpContext context)
{
    try
    {
        await _next.Invoke(context);
    }
    catch (Exception ex)
    {
        await HandleException(context, ex);
    }
}

Это должно работать:)

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