如何在asp.net MVC Preview 5中使用 [HandleError]
过滤器?
我在我的Web.config文件中设置了customErrors
<customErrors mode="On" defaultRedirect="Error.aspx">
<error statusCode="403" redirect="NoAccess.htm"/>
<error statusCode="404" redirect="FileNotFound.htm"/>
</customErrors>
并将[HandleError]放在我的Controller类上面,如下所示:
[HandleError]
public class DSWebsiteController: Controller
{
[snip]
public ActionResult CrashTest()
{
throw new Exception("Oh Noes!");
}
}
然后我让我的控制器从这个类继承并在它们上调用CrashTest() . 视觉工作室在错误时停止并按下f5继续后,我被重新路由到Error.aspx?aspxerrorpath = / sxi.mvc / CrashTest(其中sxi是所用控制器的名称 . 当然道路无法找到,我得到“'''应用程序中的服务器错误 . ”404 .
这个站点从预览3移植到5.除了错误处理之外,所有东西都运行(没有太多工作要移植) . 当我创建一个完整的新项目时,错误处理似乎有效 .
想法?
--Note--
由于这个问题现在有超过3K的视图,我认为放入我目前使用的(ASP.NET MVC 1.0)是有益的 . 在mvc contrib project中有一个名为"RescueAttribute"的辉煌属性你也应该检查一下;)
6 回答
当你只为你的类提供HandleError属性时(或者你的动作方法),当发生未处理的异常时,MVC将首先在Controller的View文件夹中查找名为“Error”的相应视图 . 如果它找不到它,那么它将继续查看共享视图文件夹(默认情况下应该包含Error.aspx文件)
您还可以使用有关所查找的异常类型的特定信息来堆叠其他属性 . 此时,您可以将错误定向到默认“错误”视图以外的特定视图 .
有关更多信息,请查看Scott Guthrie's blog post .
还应注意,未将http错误代码设置为500的错误
(例如UnauthorizedAccessException)
HandleError过滤器不会处理 .
MVC中的属性在 get and post 方法的错误处理中非常有用,它也跟踪 ajax call .
在应用程序中创建一个基本控制器,并在主控制器(EmployeeController)中继承它 .
public class EmployeeController : BaseController
在基本控制器中添加以下代码 .
================================================
Finds the Directory : Root/App_Start/FilterConfig.cs
添加以下代码:
Track AJAX Error:
在布局页面加载中调用CheckAJAXError函数 .
将http错误代码解为500这是一个名为[ERROR]的属性,将其置于一个动作上
//例:
您缺少Error.aspx :)在预览5中,它位于您的Views / Shared文件夹中 . 只需从新的预览5项目中复制它 .
}