Is it possible to create a final route that catches all .. and bounces the user to a 404 view in ASP.NET MVC?
NOTE: I don't want to set this up in my IIS settings.
Is it possible to create a final route that catches all .. and bounces the user to a 404 view in ASP.NET MVC?
NOTE: I don't want to set this up in my IIS settings.
Found the answer myself.
Richard Dingwall has an excellent post going through various strategies. I particularly like the FilterAttribute solution. I'm not a fan of throwing exceptions around willy nilly, so i'll see if i can improve on that :)
For the global.asax, just add this code as your last route to register:
routes.MapRoute( "404-PageNotFound", "{*url}", new { controller = "StaticContent", action = "PageNotFound" } ); {*url} still not overcome this issue. What if the mapped URL into route is available but the controller/action itself did not found. If I browse to /Home/About123 ugly asp.net error page still come out because the route not reach to the {*url} but handled in my home route.This question came first, but the easier answer came in a later question:
Routing for custom ASP.NET MVC 404 Error page
I got my error handling to work by creating an ErrorController that returns the views in this article. I also had to add the "Catch All" to the route in global.asax.
I cannot see how it will get to any of these error pages if it is not in the Web.config..? My Web.config had to specify:
customErrors mode="On" defaultRedirect="~/Error/Unknown"and then I also added:
error statusCode="404" redirect="~/Error/NotFound"Hope this helps.
I love this way now because it is so simple:
<customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect"> <error statusCode="404" redirect="~/Error/PageNotFound/" /> </customErrors> Config Error: The configuration section 'customErrors' cannot be read because it is missing a section declaration.Also you can handle NOT FOUND error in Global.asax.cs as below
protected void Application_Error(object sender, EventArgs e) { Exception lastErrorInfo = Server.GetLastError(); Exception errorInfo = null; bool isNotFound = false; if (lastErrorInfo != null) { errorInfo = lastErrorInfo.GetBaseException(); var error = errorInfo as HttpException; if (error != null) isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound; } if (isNotFound) { Server.ClearError(); Response.Redirect("~/Error/NotFound");// Do what you need to render in view } } Add this lines under your project root web.config File.
<system.webServer> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" /> <error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" /> <remove statusCode="500" /> <error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" /> </httpErrors> <modules> <remove name="FormsAuthentication" /> </modules> This might be a problem when you use
throw new HttpException(404); When you want to catch that, I don't know any other way then editing your web config.
Exception you want. Let all your controller derived from a BaseController. In this BaseController you override OnException and set the filterContext.Result either redirect or view result.An alternative to creating a catch-all route is to add an Application_EndRequest method to your MvcApplication per Marco's Better-Than-Unicorns MVC 404 Answer.
If the route cannot be resolved, then MVC framework will through 404 error.. Best approach is to use Exception Filters ... Create a custom exceptionfilter and make like this..
public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { filterContext.Result = new RedirectResult("~/Content/RouteNotFound.html"); } }