10

我有一个关于在我的 MVC 5 应用程序中使用 HandleErrorAttribute 的最佳方式的问题。众所周知,我们可以像这样将此属性添加到全局过滤器中:

 filters.Add(new HandleErrorAttribute{View = "Error"});

这涉及到应用程序每次在任何级别的应用程序中引发未处理的异常时都显示“错误”视图。但是,如果我在另一个全局授权或操作过滤器中有一些逻辑,会产生一些异常,那么当第一次抛出异常时,应用程序会尝试重定向到错误视图,其他过滤器再次开始执行并产生相同的异常同样,为了避免循环,asp.net 会终止应用程序。那么使用这个 HandleErrorAttribute 来避免这种行为的最佳方法是什么?谢谢!

编辑: 经过一些调试,我发现这不是 HandleErrorAttribute 的常见行为,所以只有当我使用自定义路由 fe 时才会发生循环

{key}/{controller}/{action}

并且当过滤器逻辑中发生一些错误时,应用程序会尝试重定向到错误视图,但另一个过滤器逻辑再次开始执行,我什至在 {key} 路由参数中看到“错误”值,所以它是不需要的行为。当我使用默认路由时,{controller}/{action} 这不会发生,并且我无需再次执行任何全局过滤器逻辑即可完全进入错误视图。

4

2 回答 2

10

您应该将您的操作过滤器逻辑包装在 a 内try catch,然后在catch块内,重定向到Error视图并传递Exception.

您唯一的其他选择是HandleError完全放弃并使用Application_ErrorGlobal.asax 中的事件来管理您的错误处理。这样Error,无论错误发生在哪里,您都可以在那里重定向到您的操作。

于 2013-09-26T10:59:24.567 回答
3

马特对 global.asax 的看法是正确的...这是我遵循的示例 http://www.digitallycreated.net/Blog/57/getting-the-correct-http-status-codes-out-of-asp.net-自定义错误页面

然后在每个视图中我添加: Response.StatusCode = 500; 或者我想向客户展示的其他代码。

于 2014-02-06T21:33:51.923 回答