我的解决办法在global中Application_EndRequest 具体办法我贴出来 仅供大家参考
1 protected void Application_EndRequest() 2 { 3 var statusCode = Context.Response.StatusCode; 4 var routingData = Context.Request.RequestContext.RouteData; 5 if (statusCode == 404 || statusCode == 500) 6 { 7 Response.Clear(); 8 var area = DataHelper.ConvertTo(routingData.DataTokens["area"], string.Empty); 9 if (area == "Admin") 10 { 11 Response.RedirectToRoute("Admin_Default", new { controller = "BackError", action = "NotFound", IsReload = 1 }); 12 } 13 else 14 { 15 Response.RedirectToRoute("Default", new { controller = "Error", action = "NotFound", id = UrlParameter.Optional }); 16 } 17 18 } 19 }
用ActionFilter,写两个不同的继承自HandleErrorAttribute的Filter。
public class ErrorAttribute : ActionFilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { //获取异常信息,入库保存 Exception Error = filterContext.Exception; string Message = Error.Message;//错误信息 string Url = HttpContext.Current.Request.RawUrl;//错误发生地址 filterContext.ExceptionHandled = true; filterContext.Result = new RedirectResult("../Error/ErrorPage?ErrorMsg=" + Message);//跳转至错误提示页面 } }
然后在控制器或者Action上进行标注
[Error] public class BaseController : Controller {
我是这样实现的。这是前台异常处理,
至于404你可以在配置文件中定义
<customErrors mode="On" defaultRedirect="Controllers/Action"> <error statusCode="403" redirect="Controllers/Action" /> <error statusCode="404" redirect="Controllers/Action" /> </customErrors> 这里不是对应你想转到的页面而是你所想跳转的某个Controllers 中的某个Action
这里能配置两个404页面吗 我异常是放在BaseController里面处理的
@Jerry Long:
你前后台难道还公用一个配置文件吗?
@aehyok:我前后台是放在一个项目里
用过滤器可以实现。ActionFilter
继承下HandleErrorAttribute 获取当前的area如果area是某个值跳转到一个地址 area是空说明是前台