0
votes

This must be simple and already answered, but I've wasted many hours on it. I can't figure how to get an error page on mistyped address. Also I'd prefer not to redirect, but to keep the URL. I've tried many combinations of CustomErrors, HttpErrors and Application_Error, but nothing works for non-existent controller - depending on HttpErrors I always get IIS 404.0 page or just an empty 404 response. Running on IIS 7.5, MVC 3.

2
possible duplicate of How can I properly handle 404 in ASP.NET MVC? For what it's worth, this is the approach I use. It's a serious PIA to set up intiially, and it really does seem overly complicated (and I'm inclined to think it is) -- but...it works great, is very flexible, and you can get precisely what you want.Kirk Woll
Thx cap. Kirk ;) I'll give it a try, but IMHO it's too complicated for such a common scenario ...user1318555
that's fine, there are many solutions offered at that link. If you are looking for the simplest solution possible, that has also been covered.Kirk Woll

2 Answers

0
votes

I don't remember where I got the solution. But here is the code to handle the error: First, you create a ErrorController:

public class ErrorController : Controller
{
    //
    // GET: /Error/
    public ActionResult Index()
    {
        return RedirectToAction("Index", "Home");
    }

    public ActionResult Generic()
    {
        Exception ex = null;
        try
        {
            ex = (Exception)HttpContext.Application[Request.UserHostAddress.ToString()];
        }
        catch { }

        return View();
    }

    public ActionResult Error404()
    {            
        return View();
    }
}

Second, open Global file and add the following code:

protected void Application_Error(object sender, EventArgs e)
{
     Exception ex = Server.GetLastError();
     Application[HttpContext.Current.Request.UserHostAddress.ToString()] = ex;
}

Third, change customerror in your webconfig:

<customErrors mode="Off" defaultRedirect="/Error/Generic">
  <error statusCode="404" redirect="/Error/Error404"/>
</customErrors>

More: I created one more error layout. It makes things even more clear. :)

Hope this helps you.

0
votes

I use the following route to ensure all requests not matching any other route fall there, then you can handle that case very easily:

        // this route is intended to catch 404 Not Found errors instead of bubbling them all the way up to IIS.
        routes.MapRoute(
            "PageNotFound",
            "{*catchall}",
            new { controller = "Error", action = "NotFound" }
        );

Map that last (include that statement after any other .MapRoute statements).