Обработка исключений и перенаправление из компонента просмотра - PullRequest
0 голосов
/ 26 февраля 2019

Мне было интересно, как я могу реализовать обработку исключений в моем компоненте представления.Оборачивание логики из моего метода действия в блоки try catch не перехватывает никаких исключений, возникающих внутри самой логики компонента view, и я не хочу, чтобы приложение перестало функционировать независимо от каких-либо ошибок.Это то, что я делаю до сих пор и пытаюсь выполнить:

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

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?
    }
  }

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

1 Ответ

0 голосов
/ 26 февраля 2019

Вы можете попытаться перенаправить на другую страницу, используя 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

...