Search code examples
c#asp.net-mvc-4global-asaxcustom-routes

global.asax redirecttoroute not working


I want to use a custom route in my global.asax with response.redirecttoroute but it is not working. I have the following in my RouteConfig:

routes.MapRoute(
            name: "Error",
            url: "Error/{action}/{excep}",
            defaults: new { action = "Index", excep = UrlParameter.Optional }
        );

And in my global.asax I do the following:

Response.RedirectToRoute("Error", new { action="Index", excep=ex.Message });

In my ErrorController I have:

public ActionResult Index(string excep)
    {
        ViewBag.Exception = excep;

        return View();
    }

And in my Index view for the error I call the ViewBag.Exception to show the exception.

When I use:

Response.Redirect("/Error/Index/0/"+ex.Message, true);

And use this in my controller:

public ActionResult Index(int? id,string excep)
    {
        ViewBag.Exception = excep;

        return View();
    }

It works, but this is with the default route and is not what I want. Why does it work with a redirect but not with redirecttoroute?


Solution

  • I faced the same issue but now I found a solution. Maybe you can try this: Just rename the class names or variable names to your needs. Take note after changing anything from your Global.asax clear your browser cache. Hope this helps.

    Global.asax

      public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
           //Make sure this route is the first one to be added
            routes.MapRoute(
               "ErrorHandler",
               "ErrorHandler/{action}/{errMsg}",
               new { controller = "ErrorHandler", action = "Index", errMsg=UrlParameter.Optional}
               );
            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );
    
        }
    

    Once an unhandles exception occurs redirect the response to your error handler from your Global.asax Application_Error event

     protected void Application_Error(object sender, EventArgs e)
            {
                var errMsg = Server.GetLastError().Message;
                if (string.IsNullOrWhiteSpace(errMsg)) return;
                //Make sure parameter names to be passed is are not equal
                Response.RedirectToRoute("ErrorHandler", new { strErrMsg=errMsg });
                this.Context.ClearError();
            }
    

    Error Handler Controller

    public class ErrorHandlerController : Controller
        {
    
            public ActionResult Index(string strErrMsg)
            {
                ViewBag.Exception = strErrMsg;
                return View();
            }
    
        }
    

    To test the error handler on your Index ActionResult of HomeController add this code.

    public class HomeController : Controller
        {
            public ActionResult Index()
            {
                //just intentionally add this code so that exception will occur
                int.Parse("test");
                return View();
            }
        }
    

    The output will be

    enter image description here