11

我在使用控制器操作上的 [HandleError] 属性时遇到问题 - 它似乎根本不起作用(即过滤器是否存在并不重要 - 我得到相同的结果......)。当抛出异常时,我在“/”应用程序错误页面中得到标准的红色服务器错误,而不是我的自定义视图。

我在 SO 上找到了关于这个主题的其他几个线程,在大多数情况下,似乎在 web.config 中将 customErrors 选项设置为 On 解决了这个问题。它不适合我,所以我需要找到不同的解决方案。

我的控制器动作:

[HandleError]
public ActionResult Index()
{
    throw new Exception("oops...");
    return View();
}

在我的 web.config 文件中

<customErrors mode="On"></customErrors>

我已确保 Error.aspx 文件也在 Shared 目录中。我错过了什么?

我正在运行 ASP.NET MVC RC 刷新。

4

6 回答 6

13

两件有用的事情要知道:

默认情况下,HandleError在开发服务器下运行时不执行任何操作。目的是向开发人员展示更多有用的信息:

public virtual void OnException(ExceptionContext filterContext) {
    if (filterContext == null) {
        throw new ArgumentNullException("filterContext");
    }

    // If custom errors are disabled, we need to let the normal ASP.NET
    // exception handler execute so that the user can see useful
    // debugging information.
    if (filterContext.ExceptionHandled
        || ! filterContext.HttpContext.IsCustomErrorEnabled) {
        return;
    }

请注意,这种情况正是customError应该控制的。如果设置customError="On"没有改变这种行为:

  1. 检查你的语法。
  2. 确保您正在编辑Web.config项目根目录中的,而不是视图中的那个。
  3. 确保没有代码集HttpContext.IsCustomErrorEnabled
  4. 如果所有其他方法都失败,请尝试关闭调试Web.config

其次,某些类型的错误HandleError永远无法处理,尤其是 ASP.NET 编译错误。你没有说你遇到了哪个错误。

于 2009-02-09T15:15:12.027 回答
4

您还需要指定要重定向到的页面。

<customErrors mode="On" defaultRedirect="Error.aspx" />

编辑:抱歉 /Shared/ 部分不应该在那里打赌,但您需要告诉 MVC 使用 Error.aspx 将用户发送到哪个页面。然后默认路由会在 shared 中查找名为 Error.aspx 的内容。

很晚了!:) 我想这就是为什么有人给我一个减号的答案!:) 至少它在这里有效,伙计!

于 2009-02-08T02:27:55.613 回答
3

我遇到了同样的问题,我花了整整两天的时间才弄清楚。结果是我在 Site.Master 页面中出现错误,并且 Error.aspx 使用与所有其他页面相同的母版页。显然 Error.aspx 无法处理这种情况。

我的解决方案是创建一个轻量级且不包含任何模型数据的特定 Error.master 页面。另外,我创建了一个静态 Error.htm,以防 Error.aspx 发生错误。Web.config 设置如下:

<customErrors mode="On">
    <error statusCode="500" redirect="Error.htm" />
</customErrors>

希望能帮助到你。

于 2009-05-04T22:41:20.597 回答
0

这个问题的另一个原因可能是,

在 Template MVC Application(由 VS2008 / VS2008 Express 生成)中,Error.aspx(由 VS 生成)使用 Master Page。

如果母版页访问任何 ViewData 它将抛出空引用 Exception ,那么 error.aspx 将不会显示。

使用此简单代码作为您的 Error.aspx ,它将解决问题,(连同 CustomErrors=On )

<%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>
于 2009-07-27T14:26:34.183 回答
0

为了在应该显示 Error.aspx 时解决 404 问题,我必须从 httpHandler 部分中排除 Error.aspx,这会阻止直接访问任何视图(围绕 mvc 2 框架)。我通过将 Error.aspx 放在一个“错误”子文件夹中并将 web.config 放在这个子文件夹中并 <remove path="*" verb="*" /> 在 httpHandlers 部分中放置一个来做到这一点。我对这个问题的版本(及其解决方案)可能特定于 MVC 2。

请记住在移动 Error.aspx 时更新 defaultRedirect 引用:)

于 2010-09-29T09:29:35.303 回答
0

我尝试了上述建议,但对我没有任何帮助。诀窍是从我的错误控制器中的操作中删除这条线。

Response.StatusCode = (int)HttpStatusCode.NotFound;

由于 IIS 错误消息一直在拦截我的错误处理,我一直在努力。虽然它并不理想,因为我想在响应中提供该状态代码,但我发现删除它可以防止 IIS 7+ 干扰我的错误处理。

大部落

于 2011-07-11T07:32:57.720 回答