2013-06-26 77 views
2

在Visual Studio 2012中,我使用模板创建了一个新的ASP.NET MVC3项目。然后创建具有以下ActionResult一个HomeControllerMVC3 HandleError不适用于ASP.NET MVC3 EmptyTemplate项目

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

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

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

和插入在{}根/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内部服务器错误。网站无法显示该页面...

然后,我决定使用互联网模板来创建另一个ASP.NET MVC3项目。在HomeController的内部,我抛出了一个Exception,就像我上面所做的一样,并且我在Web.config中再次打开了customErrors。当我运行该项目时,我得到正确的结果:

对不起,处理您的请求时发生错误。

这两个项目之间可能会丢失什么?

我已经一行一行通过Web.config并没有看到任何区别。 Global.asax文件不受两个项目的影响。

回答

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视图。

+0

创建项目时添加这个项目:( –

+0

你在IIS或IIS Express中运行,我不能重现该问题,我总是得到正确的结果(错误视图) –

+0

hmm。两个项目最初运行在IIS Express,但我在IIS中测试了它们,结果相同。 –

1

我不能相信这...

由于科斯明ONEA注释下他我脱离HandleErrorAttributeOnException继承被解雇了,因为它应该。在做出更改之后,我跑过了这个SO answer并在Chrome浏览器中测试了我的页面,在那里我看到了一直存在的适当消息。

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