Обработка исключений и перенаправление из компонента представления

Как я могу реализовать обработку исключений в моем компоненте представления?

Заключение логики из моего метода действия в блоки _1 _ / _ 2_ не улавливает никаких исключений, возникающих в самом компоненте представления, и я не хочу, чтобы приложение прекращало работу независимо от каких-либо ошибок. Это то, что я делаю до сих пор и пытаюсь достичь:

Метод действия

public IActionResult LoadComments(int id)
{
  try
  {
    return ViewComponent("CardComments", new { id });
  }
  catch (SqlException e)
  {
    return RedirectToAction("Error", "Home");
  }
}

Повторюсь, это не перехватывает SqlException, который возникает внутри самого компонента представления, и, следовательно, не может выполнить перенаправление.

Просмотр компонента

public class CardCommentsViewComponent : ViewComponent
{
  public async Task<IViewComponentResult> InvokeAsync(int id)
  {
    try
    {
      IEnumerable<CardCommentData> comments = await DbHelper.GetCardCommentData(id);
      return View(comments);
    }
    catch (SqlException e)
    {
      //Redirect from here if possible?
    }
  }
}

Могу ли я сделать это с помощью метода действий контроллера? Если нет, как я могу перенаправить из самого компонента представления? Я попытался исследовать эту проблему, но ничего не вышло. Любая информация будет полезна.


person Jessie Cryer    schedule 25.02.2019    source источник


Ответы (1)


Вы можете попробовать перенаправить на другую страницу, используя HttpContextAccessor.HttpContext.Response.Redirect:

public class CardCommentsViewComponent : ViewComponent
{

    private readonly IHttpContextAccessor _httpContextAccessor;
    public CardCommentsViewComponent( IHttpContextAccessor httpContextAccessor)
    {

        _httpContextAccessor = httpContextAccessor;
    }
    public async Task<IViewComponentResult> InvokeAsync(int id)
    {
        try
        {
            IEnumerable<CardCommentData> comments = await DbHelper.GetCardCommentData(id);
            return View(comments);
        }
        catch (SqlException e)
        {
            _httpContextAccessor.HttpContext.Response.Redirect("/About");

            return View(new List<CardCommentData>());
        }
    }
}

Зарегистрируйтесь в DI:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

Но предпочтительный способ - использовать глобальный обработчик / фильтр исключений для отслеживания исключения и перенаправления на соответствующую страницу ошибки:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-2.2

person Nan Yu    schedule 26.02.2019
comment
Хорошо, поэтому использование глобального обработчика исключений работает для перенаправления меня на выделенную страницу ошибок, но как мне регистрировать ошибки, имеет ли блок catch приоритет над глобальным обработчиком исключений? - person Jessie Cryer; 04.03.2019
comment
@JessieCryer, это основано на вашем дизайне, вы можете регистрировать ошибки в контроллере / действии каждой страницы с ошибкой. - person Nan Yu; 04.03.2019