Home > DeveloperSection > Forums > How to handle 404 in ASP.NET MVC?
Royce Roy
Royce Roy

Total Post:134

Points:938
Posted on    February-02-2015 10:24 PM

 ASP.Net C#  ASP.NET MVC  Mvc4 
Ratings:


 1 Reply(s)
 517  View(s)
Rate this:

I am just getting started on ASP.NET MVC so bear with me. I've searched around this site and various others and have seen a few implementations of this.

EDIT: I forgot to mention I am using RC2

Using URL Routing:

routes.MapRoute(

    "Error",

     "{*url}",

     new { controller = "Errors", action = "NotFound" }  // 404s

);

The above seems to take care of requests like this (assuming default route tables setup by initial MVC project): "/blah/blah/blah/blah"

Overriding HandleUnknownAction() in the controller itself:

// 404s - handle here (bad action requested

protected override void HandleUnknownAction(string actionName) {

    ViewData["actionName"] = actionName;

    View("NotFound").ExecuteResult(this.ControllerContext);

However the previous strategies do not handle a request to a Bad/Unknown controller. For example, I do not have a "/IDoNotExist", if I request this I get the generic 404 page from the web server and not my 404 if I use routing + override.

So finally, my question is: Is there any way to catch this type of request using a route or something else in the MVC framework itself?

OR should I just default to using Web.Config customErrors as my 404 handler and forget all this? I assume if I go with customErrors I'll have to store the generic 404 page outside of /Views due to the Web.Config restrictions on direct access. Anyway any best practices or guidance is appreciated.



ben reitman
ben reitman

Total Post:96

Points:676
Supported
Posted on    February-02-2015 10:43 PM

Here's how I handle http exceptions:

protected void Application_Error(object sender, EventArgs e)

{

   Exception exception = Server.GetLastError();

   // Log the exception.

 

   ILogger logger = Container.Resolve<ILogger>();

   logger.Error(exception);

 

   Response.Clear();

 

   HttpException httpException = exception as HttpException;

 

   RouteData routeData = new RouteData();

   routeData.Values.Add("controller", "Error");

 

   if (httpException == null)

   {

       routeData.Values.Add("action", "Index");

   }

   else //It's an Http Exception, Let's handle it.

   {

       switch (httpException.GetHttpCode())

       {

          case 404:

              // Page not found.

              routeData.Values.Add("action", "HttpError404");

              break;

          case 500:

              // Server error.

              routeData.Values.Add("action", "HttpError500");

              break;

 

           // Here you can handle Views to other error codes.

           // I choose a General error template 

           default:

              routeData.Values.Add("action", "General");

              break;

      }

  }          

 

  // Pass exception details to the target error View.

  routeData.Values.Add("error", exception);

 

  // Clear the error on server.

  Server.ClearError();

 

  // Avoid IIS7 getting in the middle

  Response.TrySkipIisCustomErrors = true;

 

  // Call target Controller and pass the routeData.

  IController errorController = new ErrorController();

  errorController.Execute(new RequestContext(   

       new HttpContextWrapper(Context), routeData));

}


Don't want to miss updates? Please click the below button!

Follow MindStick