Major Productions
Major Productions

Reputation: 6042

A couple of errors when trying to use custom errors in MVC 2

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

Upvotes: 1

Views: 188

Answers (1)

Nick Larsen
Nick Larsen

Reputation: 18877

With the Http 500 errors, you are probably getting the default page because you have a HandleError attribute applied to your controller. You can specify a view in the HandleError attribute for the error type you would like directed there, but isn't very well developed for handling HttpExceptions. If you remove this attribute from your controller, the default asp.net stuff should take over. You could also just override OnException in 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.StatusCode in the .Execute() method of a class that inherits ActionResult. Conceptually, the result of an action is the part of code that should build the response and implementing parts of that outside of the ActionResult, like you do here in your controller, is prone to causing very hard to find bugs. I know the HttpStatusCodeResult that 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 from ViewResult.

Upvotes: 1

Related Questions