属性似乎根本不起作用

时间:2009-02-08 00:55:59

标签: asp.net-mvc error-handling attributes handleerror

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

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

我的控制器操作:

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

在我的web.config文件中

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

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

我正在运行ASP.NET MVC RC Refresh。

6 个答案:

答案 0 :(得分:12)

要了解两件有用的事情:

默认情况下,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,而不是编辑视图中的HttpContext.IsCustomErrorEnabled
  3. 确保没有代码集Web.config
  4. 如果其他所有方法都失败了,请尝试在HandleError
  5. 中关闭调试功能

    其次,{{1}}永远不会处理某些类型的错误,尤其是ASP.NET编译错误。您没有说出您遇到的错误。

答案 1 :(得分:3)

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

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

编辑:抱歉,/ Shared / part不应该在那里下注,但你需要告诉MVC哪个页面将用户发送到Error.aspx。然后默认路由在共享中查找名为Error.aspx的内容。

已经很晚了! :)我猜这就是为什么有人给我一个减号的答案! :)至少它在这里工作伙伴!

答案 2 :(得分: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>

希望它有所帮助。

答案 3 :(得分:0)

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

在模板MVC应用程序(由VS2008 / VS2008 Express生成)中,Error.aspx(由VS生成)使用母版页。

如果Master Page访问任何ViewData,它将抛出null引用Exception,则不会显示error.aspx。

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

<%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>

答案 4 :(得分:0)

为了解决在应该显示Error.aspx时的404问题,我不得不从httpHandler部分排除Error.aspx,这阻止了任何视图被直接访问(在mvc 2框架周围)。我通过将Error.aspx放在'Error'子文件夹中并将web.config放入此子文件夹中来实现此目的     <remove path="*" verb="*" /> 在httpHandlers部分。我对此问题的版本(及其解决方案)可能特定于MVC 2.

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

答案 5 :(得分:0)

我尝试了上述建议,但对我没什么用。诀窍是从我的错误控制器中的操作中删除这一行。

Response.StatusCode = (int)HttpStatusCode.NotFound;

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

DaTribe

相关问题