如何在ASP.NET MVC 3中创建自定义404错误页面?

时间:2011-06-28 20:49:03

标签: asp.net-mvc error-handling http-status-code-404

在ASP.NET MVC 3中创建自定义错误页面的最佳方法是什么?我特别感兴趣的是404错误,但也有403错误。我是MVC框架的新手,传统上我来自PHP背景,但我正在快速学习。

我在发布此问题之前做了我的研究,并发现了这个链接: Custom error pages on asp.net MVC3

这个解决方案看起来很简单虽然当我尝试在我的机器上实现它时,我遇到了以下问题:IController errorsController = new ErrorsController();在Application_Error()函数内部。它说“无法找到类型或命名空间名称'ErrorsController'(您是否缺少using指令或程序集引用?”。

提前感谢您提供的帮助。

2 个答案:

答案 0 :(得分:15)

您应该配置

<httpErrors>

下的

部分

<system.webServer> 
web.config文件中的

部分组。

请参阅这篇文章:

http://www.iis.net/ConfigReference/system.webServer/httpErrors

此外,您可以使用您在问题中链接的错误控制器,但初始流程应由IIS管理。通过本节,您可以指示IIS应该执行由您的控制器管理的URL。

另外请注意控制器操作中正确的Response.Status属性字符串,因为建议的解决方案返回“200 OK”,这可能会让浏览器感到困惑。例如

public class ErrorsController : Controller
{
    public ActionResult NotFound()
    {
        Response.Status = "404 Not Found";
        return View();
    }

    public ActionResult ServerError()
    {
        byte[] delay = new byte[1];
        RandomNumberGenerator prng = new RNGCryptoServiceProvider();

        prng.GetBytes(delay);
        Thread.Sleep((int)delay[0]);

        IDisposable disposable = prng as IDisposable;
        if (disposable != null) { disposable.Dispose(); }
        Response.Status = "500 Internal Server Error";
        return View();
    }

}

配置示例:

<httpErrors defaultPath="/error.htm" errorMode="Custom" existingResponse="Replace" defaultResponseMode="ExecuteURL">
      <remove statusCode="500" subStatusCode="-1" />
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="500" path="/errors/servererror/" responseMode="ExecuteURL" />
      <error statusCode="404" path="/errors/notfound/" responseMode="ExecuteURL" />
  </httpErrors>

您可以使用“subStatusCode”属性控制404.3和其他。

答案 1 :(得分:2)

Application_EndRequest添加MvcApplication方法,根据Marco's Better-Than-Unicorns MVC 404 Answer为“未找到”页面调用视图。