Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用股票标准ASP.NET MVC3网站定制404和500错误页面?_C#_.net_Asp.net Mvc_Error Handling - Fatal编程技术网

C# 如何使用股票标准ASP.NET MVC3网站定制404和500错误页面?

C# 如何使用股票标准ASP.NET MVC3网站定制404和500错误页面?,c#,.net,asp.net-mvc,error-handling,C#,.net,Asp.net Mvc,Error Handling,我试图在一个股票样本ASP.NETMVC3网站中有2个自定义错误页面 但它不适用于我所有的测试条件 还有一个广受欢迎的帖子。。但这只涉及404错误 有人能解释一下吗 路线 web.config设置 控制器/动作方法 我们需要做一件非常简单的事情:( 接受此答案的场景: VS2010->文件->新建->ASP.NET MVC3项目/互联网应用程序 (右键单击解决方案)->使用IIS Express 错误页面不能是静态html页面。它们必须是我可以向其传递信息的页面,就像任何其他视图一样(例如

我试图在一个股票样本ASP.NETMVC3网站中有2个自定义错误页面

但它不适用于我所有的测试条件

还有一个广受欢迎的帖子。。但这只涉及404错误

有人能解释一下吗

  • 路线
  • web.config
    设置
  • 控制器/动作方法
我们需要做一件非常简单的事情:(

接受此答案的场景:

  • VS2010->文件->新建->ASP.NET MVC3项目/互联网应用程序
  • (右键单击解决方案)->使用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/throweexception
    ->500错误
干杯:)


顺便说一句,在使用股票标准
新ASP.NET MVC3
模板时,一些很长的路由(上面)现在给出了非常奇怪的错误页面,您可以在web.config中设置错误页面信息。本页介绍如何执行此操作,以及如何在控制器上使用HandleErrorAttribute集,以便它们使用此配置


这似乎是个大问题

请看我的答案是:

但我会将这些路径添加到您的测试用例中:


我在我的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
            /// 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);
            }
        }

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

Pure.Krome,您基本上关心500错误吗?在您的第二个链接中,Cottsak的帖子如所希望的那样处理了上述所有404场景。这是一个非常好的解决方案。。但正如我所问的,404和500呢?我认为,这些东西应该被支持到框架中,并成为首批教程之一。静态页面,IMO,不够好:(当然,它可能会有一个相当失败的哀号,但有时我们需要一点逻辑。你看过我的答案Pure.Krome吗?它允许你将特定的错误代码重定向到任何路由。如果你想“正确”,你甚至可以在操作中设置状态代码Pure.Krome,我一直在考虑这个问题,从HandleErrorAttribute继承的自定义属性是否能满足您的需求?请参阅。其要点是您实现自己版本的HandleError,它允许您实现自己的模型,而不是基本System.Web.Mvc.HandleErrorInfo模型。您可以设置所需的任何数据anted允许您将信息传递到500视图。@Khepri-如果您想将内置的东西用于HandleError(即扩展模型),这将非常有用.这是一个很大的问题…我仍然在为所有这些场景获取一些基本的404和500错误处理。更不用说自定义视图了。有一个问题-你用404页面的url替换初始查询,这对用户来说肯定是不好的。我试着实现了这一点,但错误400失败了,有什么想法吗?我只是简单地得到了答案标准错误页面,而不是我在
中指定的页面。我可能错了,如果我错了,请有人纠正我,但我不认为400个错误是可定制的?快速问题,你为什么不将该路由放在App_Start>RouteConfig.cs文件中?@Termato,你现在是在2014年,但当时路由是在global.asax文件中。