【问题标题】:How to have a custom 404 and 500 error pages with a stock standard ASP.NET MVC3 website?如何使用股票标准 ASP.NET MVC3 网站创建自定义 404 和 500 错误页面?
【发布时间】:2011-09-04 14:46:05
【问题描述】:

我正在尝试在股票示例 ASP.NET MVC3 网站中创建 2 个自定义错误页面。

Darin Dimitrov has a good SO answer here 但它不适用于我的所有测试条件。

然后是广受欢迎的How can I properly handle 404s in ASP.NET MVC? 帖子.. 但这只是涉及 404 错误。

谁能解释一下

  • 路线
  • web.config 设置
  • 控制器/操作方法

需要做这个非常简单的事情:(

接受这个答案的场景:

  • VS2010 -> 文件 -> 新建 -> ASP.NET MVC3 项目/Internet 应用程序
  • (右键单击解决方案).. -> 使用 IIS Express
  • 错误页面不能是静态 html 页面。它们必须是我可以向其传递信息的页面,就像任何其他视图等一样(例如ErrorController)...

对于测试路线...

  • /Home/Index -> 显示索引页
  • /Home -> 显示索引页
  • / -> 显示索引页
  • /Home/About -> 显示页面
  • /asdasd/asdsad/asdas/asddasd/adsad -> 404
  • /adsa/asda/asd/asd/asd/asd -> 404
  • /asdsadasda -> 404

然后将其添加到HomeController.cs 类..

public ActionResult ThrowException()
{
    throw new NotImplementedException();
}

现在..

  • /home/throwexception -> 500 错误

干杯:)

顺便说一句,当使用股票标准 new ASP.NET MVC3 模板时,其中一些非常长的路线(上图)现在给出了非常奇怪的错误页面

【问题讨论】:

  • Pure.Krome,你基本上关心 500 错误吗?在您的第二个链接中,Cottsak 的帖子按预期处理了上述所有 404 场景。
  • 这是一个很好的解决方案.. 但正如我所问的 - 404 和 500 呢?这些东西应该被支持到框架中并且是第一个教程之一,我会想到的。静态页面,IMO,还不够好 :( 当然它可能会有一个相当失败的哀号,但有时我们需要更多的逻辑。
  • 你看过我的回答 Pure.Krome 了吗?它允许您将特定的错误代码重定向到任何路线。如果您想“正确”,您甚至可以在操作中设置状态码
  • Pure.Krome,我一直在考虑这个问题,继承自 HandleErrorAttribute 的自定义属性是否可以满足您的要求?见stackoverflow.com/questions/5742141/…。它的要点是您实现自己的 HandleError 版本,它允许您实现自己的模型而不是基本的 System.Web.Mvc.HandleErrorInfo 模型。您可以设置任何您想要的数据,以便将信息传递给 500 视图。
  • @Khepri - 如果您想为 HandleError 使用内置的东西(即扩展模型),那将非常有用。这是一个很大的问题......我仍然坚持对所有这些场景进行一些基本的 404 和 500 错误处理......更不用说自定义视图了。

标签: c# .net asp.net-mvc error-handling


【解决方案1】:

我在 web.config 文件中指定 customErrors,如下所示;

    <customErrors defaultRedirect="/Error/GeneralError" mode="On">
      <error statusCode="403" redirect="/Error/403" />
      <error statusCode="404" redirect="/Error/404" />
      <error statusCode="500" redirect="/Error/500" />
    </customErrors

我在 Global.asax 中有一条如下路线;

            /// Error Pages
            /// 
            routes.MapRoute(
                "Error", // Route name
                "Error/{errorCode}", // URL with parameters
                new { controller = "Page", action = "Error", errorCode= UrlParameter.Optional }
            );

对应的ActionResult做了如下操作,返回相关的自定义错误页面。

//
        public ActionResult Error(string errorCode)
        {
            var viewModel = new PageViewModel();

            int code = 0;
            int.TryParse(errorCode, out code);

            switch (code)
            {
                case 403:
                    viewModel.HtmlTitleTag = GlobalFunctions.FormatTitleTag("403 Forbidden");
                    return View("403", viewModel);
                case 404:
                    viewModel.HtmlTitleTag = GlobalFunctions.FormatTitleTag("404 Page Not Found");
                    return View("404", viewModel);
                case 500:
                     viewModel.HtmlTitleTag = GlobalFunctions.FormatTitleTag("500 Internal Server Error");
                    return View("500", viewModel);
                default:
                    viewModel.HtmlTitleTag = GlobalFunctions.FormatTitleTag("Embarrassing Error");
                    return View("GeneralError", viewModel);
            }
        }

这允许我有许多不同的自定义错误页面。这可能不是最好或最优雅的解决方案,但它确实对我有用。

【讨论】:

  • 有一个问题 - 你用你的 404page 的 url 替换初始查询,这对用户来说肯定是不好的。
  • 我试图实现这一点,但它因错误 400 而失败,有什么想法吗?我只是得到标准错误页面,而不是我在&lt;customErrors&gt; 中指定的页面。
  • 我可能错了,如果我错了,请有人纠正我,但我不认为 400 错误是可自定义的?
  • 小问题,你为什么不把那个路由放在 App_Start > RouteConfig.cs 文件中?
  • @Termato,你现在会在 2014 年,但当时路线在 global.asax 文件中。
【解决方案2】:

您可以在 web.config 中设置错误页面信息。本页讨论了如何执行此操作并使用控制器上设置的 HandleErrorAttribute,以便它们使用此配置。

http://deanhume.com/Home/BlogPost/custom-error-pages-in-mvc/4

【讨论】:

    【解决方案3】:
    猜你喜欢
    • 2013-07-13
    • 2014-09-30
    • 2012-05-02
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 2011-07-10
    相关资源
    最近更新 更多