Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exception handling and redirecting from view component

How can I implement exception handling in my view component?

Wrapping the logic from my action method into try/catch blocks doesn't catch any exceptions thrown within a view component itself, and I don't want the app to stop functioning regardless of any errors. This is what I'm doing so far and trying to accomplish:

Action Method

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

To reiterate, this does not catch a SqlException that occurs inside the view component itself, and thus it fails to redirect.

View Component

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

Can I accomplish this from the controller's action method? If not, how can I redirect from the view component itself? I've tried researching this problem and came up empty. Any information would be helpful.

like image 638
Jessie Cryer Avatar asked Oct 25 '25 11:10

Jessie Cryer


1 Answers

You can try to redirect to another page using 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>());
        }
    }
}

Register in DI :

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

But the preferred way is using global exception handler /filter to trace the exception and redirect to related error page :

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

like image 199
Nan Yu Avatar answered Oct 28 '25 06:10

Nan Yu



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!