在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文件。
答案 0 :(得分:1)
我简直不敢相信......
感谢下面的Cosmin Onea评论,他让我继承了HandleErrorAttribute
而OnException
被解雇了。进行此更改后,我遇到了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视图。