Вернуть существующий вид бритвы из промежуточного ПО в ядре asp.net

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

Например, когда 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 ответ


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

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

Вы также не WriteResultAsync вызова 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);
    }
}

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


Есть идеи?

10000