MVC3 HandleError不能与ASP.NET MVC3 EmptyTemplate项目一起使用

时间:2013-06-26 20:10:50

标签: asp.net-mvc-3 error-handling

在Visual Studio 2012中,我使用 Empty 模板创建了一个新的ASP.NET MVC3项目。然后,我使用以下HomeController创建了ActionResult

public ActionResult Index()
{
    throw new Exception("oops!");
    ViewBag.Message = "hello world";
    return View();
}

接下来,我为HomeController添加了一个简单的视图:

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

并在{root} /web.config中插入以下内容:

<customErrors mode="On"/>

最后,我将/Views/Shared/Error.cshtml修改为:

@model System.Web.Mvc.HandleErrorInfo
@{
    //Layout = null;
    ViewBag.Title = "Error";
}

<h2>
    Sorry, an error occurred while processing your request.
</h2>

当我运行项目时,我得到:

  

500内部服务器错误。网站无法显示页面...

然后我决定使用 Internet 模板创建另一个ASP.NET MVC3项目。在HomeController内部,我完全按照上面的方式抛出Exception,然后在Web.config中再次打开customErrors。当我运行项目时,我得到了正确的结果:

  

抱歉,处理您的请求时出错。

这两个项目之间我能错过什么?

我已经逐行浏览了Web.config并没有看到任何差异。两个项目都没有触及Global.asax文件。

2 个答案:

答案 0 :(得分:1)

我简直不敢相信......

感谢下面的Cosmin Onea评论,他让我继承了HandleErrorAttributeOnException被解雇了。进行此更改后,我遇到了SO answer并在Chrome中测试了我的页面,在那里我看到了一直存在的相应消息。

虽然我仍然感到困惑,为什么一个人在IE中运行得很好而另一个应用程序没有。

答案 1 :(得分:0)

您需要将HandleErrorAttribute注册为全局过滤器。

在Global.asax中,在Application_Start事件中注册过滤器:

    protected void Application_Start()
    {
        ...
        RegisterGlobalFilters(GlobalFilters.Filters);
        ....
    }

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

您也可以直接将过滤器应用于控制器或操作。过滤器的作用,如果发生异常,它会将filterContext上的Result设置为指向Error视图。