Deal with global errors in global.asax application? Error of MVC.
If an error is reported before the request object is created, Context.Handler == null.
When judged to be an Ajax request, we return the Json object string. When not an Ajax request, go to the error display page.
/// <summary> /// Global error /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Application_Error(object sender, EventArgs e) { Exception ex = Server.GetLastError(); LogHelper.Error(ex); // Log errors( NLog It's very good.(* ̄︶ ̄)) if (Context.Handler == null) { return; } if (new HttpRequestWrapper(Request).IsAjaxRequest()) { Response.Clear(); Response.ContentType = "application/json; charset=utf-8"; Response.Write("{\"state\":\"0\",\"msg\":\"" + ex.Message + "\"}"); Response.Flush(); Response.End(); } else { // Scheme 1 redirects to the error page with simple error information //string errurl = "/Error/Error?msg=" + ex.Message; //Response.Redirect(errurl, true); // Scheme 2 with error object, go to error page Response.Clear(); RouteData routeData = new RouteData(); routeData.Values.Add("Controller", "Error"); // Existing error controller routeData.Values.Add("Action", "Error"); // Custom error page Server.ClearError(); ErrorController controller = new ErrorController(); HandleErrorInfo handleErrorInfo = new HandleErrorInfo(ex, "Error", "Error"); controller.ViewData.Model = handleErrorInfo; ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(((MvcApplication)sender).Context), routeData)); } }
The object usage of scheme 2 is the same as the default error page (i.e. / Shared/Error.cshtml). When we don't do anything with errors, we can configure the error page to / Shared/Error.cshtml in web.config.
Code of Error.cshtml:
@model System.Web.Mvc.HandleErrorInfo @{ ViewBag.Title = "System error"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h3 class="text-danger">System error</h3> @if (Model != null) { <span class="text-warning">@(Model.Exception.Message)</span> } else { <span class="text-warning">An error occurred while processing the request.</span> }
Action code of scheme 2:
public ActionResult Error() { return View(); }