时间: 2018/09/07 22:56:47
先新建一个过滤器ExceptionHandleErrorAttribute.cs
内容如下:
1 using System; 2 using System.Net; 3 using System.Web; 4 using System.Web.Mvc; 5 using ABBPMP.Utility.NLogHelper.Static; 6 7 namespace ABBPMP.Filter 8 { 9 ///10 /// 异常捕获(业务逻辑层,UI层) 11 /// 12 public class ExceptionHandleErrorAttribute : HandleErrorAttribute 13 { 14 /// 15 /// 错误拦截 16 /// 17 /// 18 public override void OnException(ExceptionContext filterContext) 19 { 20 21 if (filterContext.ExceptionHandled) 22 { 23 return; 24 } 25 26 27 28 string message = 29 $"消息类型:{filterContext.Exception.GetType().Name}\r\n消息内容:{filterContext.Exception.Message}\r\n引发异常的方法:{filterContext.Exception.TargetSite}\r\n引发异常的对象:{filterContext.Exception.Source}\r\n异常目录:{filterContext.RouteData.GetRequiredString("controller")}\r\n异常方法:{filterContext.RouteData.GetRequiredString("action")}\r\n错误详细记录:{filterContext.Exception.StackTrace}"; 30 NLogHandler.Instance.Error(message); 31 if (!filterContext.HttpContext.Request.IsAjaxRequest()) 32 { 33 filterContext.Controller.ViewData.Model = filterContext.Exception; 34 filterContext.Result = new ViewResult 35 { 36 ViewName = "~/Views/Error/Error.cshtml", 37 ViewData = filterContext.Controller.ViewData 38 }; 39 } 40 filterContext.Result = AjaxError(filterContext.Exception.Message, filterContext); 41 42 43 44 45 filterContext.ExceptionHandled = true; 46 } 47 /// 48 /// Ajaxes the error. 49 /// 50 /// The message. 51 /// The filter context. 52 /// JsonResult 53 protected JsonResult AjaxError(string message, ExceptionContext filterContext) 54 { 55 56 //If message is null or empty, then fill with generic message 57 if (String.IsNullOrEmpty(message)) 58 message = "Something went wrong while processing your request. Please refresh the page and try again."; 59 //Set the response status code to 500 60 filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; 61 //Needed for IIS7.0 62 filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 63 return new JsonResult 64 { 65 //can extend more properties 66 Data = new AjaxExceptionModel() { ErrorMessage = message }, 67 ContentEncoding = System.Text.Encoding.UTF8, 68 JsonRequestBehavior = JsonRequestBehavior.DenyGet 69 70 }; 71 72 } 73 /// 74 /// AjaxExceptionModel 75 /// 76 public class AjaxExceptionModel 77 { 78 /// 79 /// Gets or sets the error message. 80 /// 81 /// 82 /// The error message. 83 /// 84 public string ErrorMessage { get; set; } 85 86 } 87 88 } 89 }
然后在FilterConfig添加
Global.asax全局下添加
最后处理下ajax错误处理和服务器错误呈现形式
@{ ViewBag.Title = "General Site Error"; Layout = "~/Views/Shared/_Layout.cshtml"; } <div class="container"> <div class="row text-center"> <br/> <br /> <br /> <br /> <br /> <div class="col-md-6 col-md-offset-3 text-center"> @{ var exception = ViewData.Model; var statusCode = exception == null ? 404 : 500; Response.StatusCode = statusCode; if (statusCode == 404) { <h1>404 Page not found!h1> <p>没有找到该网页!p> } else if (statusCode == 500) { <h1>500 程序异常h1> <p> <a class="btn" data-toggle="collapse" href="#collapseExample" role="button" aria-expanded="false" aria-controls="collapseExample"> Error details a> p> <div class="collapse" id="collapseExample"> <div class="card card-body"> <p style="text-align: left;">消息类型:@exception.GetType().Name<br />消息内容:@exception.Message <br />引发异常的方法:@exception.TargetSite <br />引发异常的对象:@exception.Source<br />错误详细记录:@exception.StackTracep> div> div> } } <p style="font-size: 14px; color: Gray">请使用浏览器的后退功能已保证您填写的数据没有丢失!p> div> div> <div class="row text-center"> <div class="col-md-8 col-md-offset-2"> <h3> <i class="fa fa-lightbulb-o fa-5x">i> h3> <a href="@Url.Action("Index","Home")" class="btn">GO TO HOME PAGEa> div> div> div>
$(document).ajaxError(function (event, request, settings) { //request.responseText if (request.responseText != "") { var jsonValue = jQuery.parseJSON(request.responseText); } toastr.error("