2

在 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和我上面做的一模一样的东西,然后我customErrors在 Web.config 中再次打开。当我运行项目时,我得到了正确的结果:

抱歉,处理您的请求时出现了一个错误。

这两个项目之间我可能会缺少什么?

我逐行浏览了 Web.config 并没有发现任何差异。Global.asax 文件在两个项目中都没有改变。

4

2 回答 2

1

我不敢相信这...

感谢下面的 Cosmin Onea 评论,他让我继承HandleErrorAttribute并被OnException解雇了。进行更改后,我遇到了这个SO 答案并在 Chrome 中测试了我的页面,在那里我看到了一直存在的适当消息。

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

于 2013-06-27T16:04:41.367 回答
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 设置为指向您的错误视图。

于 2013-06-26T20:52:15.933 回答