I’m getting a couple of errors when trying to use custom 404 and 500 error pages in MVC 2. I’m essentially trying to implement what I’ve found here: http://www.genericerror.com/blog/2009/01/27/ASPNetMVCCustomErrorPages.aspx So far, I have:
Placed the following line in my Web.config:
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/Http500" />
Placed the following route last in my route table:
routes.MapRoute(
null,
"{*path}",
new { controller = "Error", action = "Http404" }
);
And, created the following controller:
public class ErrorController : Controller
{
//
// GET: /Error/Http500
public ActionResult Http500()
{
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
return View("my500");
}
//
// GET: /Error/Http404/Path
public ActionResult Http404(string path)
{
Response.StatusCode = (int)HttpStatusCode.NotFound;
return View("my404", path);
}
}
With all of that, for 500 errors, the my500 view is not being rendered. Instead, it looks like the generic, default Error.aspx view is being displayed again. For 404 errors, I’m getting a YSOD telling me to turn on custom errors in my Web.config. I’m not sure what I’m missing, or if I’m even on the right track.
EDIT: Both views are in Views/Shared
With the Http 500 errors, you are probably getting the default page because you have a
HandleErrorattribute applied to your controller. You can specify a view in theHandleErrorattribute for the error type you would like directed there, but isn’t very well developed for handlingHttpExceptions. If you remove this attribute from your controller, the default asp.net stuff should take over. You could also just overrideOnExceptionin your base controller.With the Http 404 errors, there is an overload for
return View(string, string);which you are unintentionally using. Cast the path as an object (meh) or use named parameters (hooray) and it will use the path as the model for your view. Right now it thinks that is the name of the master page you want to use.This is a hard problem and you can also find more info here.
A bit of a nitpick, but I also HIGHLY recommend only setting
Response.StatusCodein the.Execute()method of a class that inheritsActionResult. Conceptually, the result of an action is the part of code that should build the response and implementing parts of that outside of theActionResult, like you do here in your controller, is prone to causing very hard to find bugs. I know theHttpStatusCodeResultthat comes with MVC2 does not let you choose a view to return along with the result, but it’s fairly trivial to roll your own inheriting fromViewResult.