Global.asax
/// <summary>/// Handle application error on a global level./// Passes handling off to the ErrorController/// </summary>protected void Application_Error()
{var exception = Server.GetLastError();
var httpException = exception as HttpException;Response.Clear();
Server.ClearError();
var routeData = new RouteData();routeData.Values["controller"] = "Errors";
routeData.Values["action"] = "General";
routeData.Values["exception"] = exception;Response.StatusCode = 500;
if (httpException != null)
{Response.StatusCode = httpException.GetHttpCode();
switch (Response.StatusCode) { case 403:routeData.Values["action"] = "Http403";
break; case 404:routeData.Values["action"] = "Http404";
break;}
}
IController errorsController = new ErrorController();var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
errorsController.Execute(rc);
}
Note: This will route our errors to the ErrorController. Lets take a look at the error controller...
ErrorController.cs
// <copyright file="ErrorController.cs" company="GinkoSolutions.com">// Copyright (c) 2011 All Right Reserved// </copyright>// <author>Sean Greasley</author>// <email>sean@ginkosolutions.com/sean@tutorialgenius.com</email>// <summary>Controller for handling errors within the application.</summary>namespace MVCEmailExample.Controllers{ using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using MVCEmailExample.Models; /// <summary> /// Controller for handling errors within the application. /// </summary>public class ErrorController : Controller
{ public ActionResult General(Exception exception) {return View("Error", new ErrorModel() { ErrorTitle = "General Error", ExceptionDetail = exception });
}
public ActionResult Http404() {return View("Error", new ErrorModel() { ErrorTitle = "Not found" });
}
public ActionResult Http403() {return View("Error", new ErrorModel() { ErrorTitle = "Forbidden" });
}
}
}
So now were handling our errors and throwing them out to the Error View (in Views/Shared!). However, were now using a strongly typed view and passing a custom class into it. This custom class contains details of our error!
ErrorModel.cs (Our custom error class!)
using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace MVCEmailExample.Models{public class ErrorModel
{public string ErrorTitle { get; set; }
public Exception ExceptionDetail { get; set; }}
}
Very simple! All it does it holds information really.
Now lets take a look at our error view...
Error View (This will already exist with a new MVC3 application) P.s. I'm using Razor syntax!
@using MVCEmailExample.Models
@model ErrorModel
@{Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>@Model.ErrorTitle</h2>
Sorry, an error occurred while processing your request.
<br />
@if (Model.ExceptionDetail != null)
{@Model.ExceptionDetail.Message
}
This is our strongly typed view (Hint: @model ErrorModel). We simply extract the error info here and display it in a very (unstylish) form!
This sample below is for a sample email application. This uses the code described above. Just hit the button without entering any information and (assuming you don't have local mail server) u'll see some errors appearing!
MVC3 Razor - Global Error Handling