MVC 2中HandleErrorFilter的问题及其解决方法

来源:互联网 发布:访客网络速度设置 编辑:程序博客网 时间:2024/06/07 19:15

近日在使用MVC2的异常处理的时候,遇到一些问题

1. 我们的Error.aspx是没有使用MasterPage

2.通过如下代码测试

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MvcApplication1.Controllers{    [HandleError]    public class HomeController : Controller    {        public ActionResult Index()        {            throw new ApplicationException();        }        public ActionResult About()        {            return View();        }        public ActionResult Test()        {            return View("Error");        }    }}
.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }

 

我们发现会遇到500错误

image

通过工具,我看到下面代码

image

其实要讲起来,应该后面三句代码是多余的

【备注】如果Error.aspx是有MasterPage的时候,又不会出错,这倒是很奇怪的。

 

这样的话,其实我们可以定义一个自己的Handler,下面这个例子,我只是把Master的属性和后面三行删除掉了。这样问题就解决了,不管有没有MasterPage,也不管是什么异常都能被Handle了

 

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MvcApplication1{    public class MyErrorHandler:ActionFilterAttribute,IExceptionFilter    {        public MyErrorHandler()        {            View = "Error";        }        public void OnException(ExceptionContext filterContext)        {            string controllerName = (string)filterContext.RouteData.Values["controller"];            string actionName = (string)filterContext.RouteData.Values["action"];            HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);            ViewResult result = new ViewResult();            result.ViewName = this.View;            result.ViewData = new ViewDataDictionary(model);            result.TempData = filterContext.Controller.TempData;            filterContext.Result = result;            filterContext.ExceptionHandled = true;        }        public string View { get; set; }    }}
.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }
原创粉丝点击