【问题标题】:404 Pages in ASP.NET MVCASP.NET MVC 中的 404 页
【发布时间】:2011-02-04 03:28:04
【问题描述】:

我正在构建我的第一个 ASP.NET MVC 网站,并试图弄清楚如何实现 404 页面。

我应该创建一个名为“404Controller”的控制器吗?如果是这样,我该如何向 IIS 注册此控制器,以便将 404 重定向到该页面?此外,在某些其他控制器代码未找到某些内容(例如,在数据库中)的情况下,我如何将请求重定向到我的 404 页面?

【问题讨论】:

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


    【解决方案1】:

    对于您正在尝试做的事情没有单一的答案,最简单和我喜欢的是使用 HttpException 类,例如

    public ActionResult ProductDetails(int id) {
    
       Product p = this.repository.GetProductById(id);
    
       if (p == null) {
          throw new HttpException(404, "Not Found");
       }
    
       return View(p);
    }
    

    在 web.config 上你可以配置 customError 页面,例如

    <customErrors mode="RemoteOnly" redirectMode="ResponseRewrite">
       <error statusCode="404" redirect="Views/Errors/Http404.aspx" />
    </customErrors>
    

    【讨论】:

    • IIS 处理错误的方式让我感到恶心。不要因为我输入错误的 URL 而重定向我。
    • @David Murdoch:redirectMode="ResponseRewrite" 没有重定向。
    • 嗯,我现在感觉好多了。 :-)
    • @UpTheCreek 如果错误页面不依赖于MVC,它确实有效。
    【解决方案2】:

    我最喜欢的选项是返回一个名为 404 的视图。

    if (article == null)
        return View("404");
    

    这将使您可以选择在共享文件夹中使用通用 404 视图,以及在文章控制器中使用特定 404 视图。

    另外,一个很大的优点是这里没有重定向。

    【讨论】:

    • 简单可定制,我喜欢。
    • 不要忘记诸如错误网址之类的未处理事件。试试这个解决方案:stackoverflow.com/questions/619895/…
    • 没错,您还必须更改状态码。但你明白了。
    【解决方案3】:

    MVC 3 包含一个 HttpNotFoundResult 类,Controller 也有一个 HttpNotFound 静态方法。

        public ActionResult Index(int id) {
            var myThing = Loader.GetById(id);
            if (myThing == null) {
                return HttpNotFound("Thing Not Found");
            }
            return View(myThing);
        }
    

    【讨论】:

      【解决方案4】:
      1. 你是对的,创建一个NotFoundController 并将路由映射到它,比如/404,然后将 URL 放入你的web.config 文件中(请参阅@R0MANARMY)答案。

        李>
      2. 您可以只使用throw new HttpException(404, "Not Found"),或者如果您不想抛出异常(代价高昂),您只需通过Response.StatusCode 属性将状态代码设置为404,然后从您的行动方法。

      【讨论】:

      • @chakrit:如果没有 NotFoundController,asp.net mvc 不会给你一个 404 吗?或者你的意思是如果你想重定向到静态 html 404 页面以外的东西?
      【解决方案5】:

      根据Marco's Better-Than-Unicorns MVC 404 AnswerApplication_EndRequest 方法添加到您的MvcApplication。要从您的代码中引发“未找到”错误,请抛出 new HttpException(404, "Not Found")

      【讨论】:

        【解决方案6】:

        以防万一它对某人有所帮助...

        与 Fitzchak 的回答类似,我的共享文件夹中有一个自定义 404 视图。要返回正确的状态代码,我只需将其添加到该视图的顶部

        @{
            ViewBag.Title = "Page Not Found";
            Response.StatusCode = 404;
        }
        

        在我的本地主机上运行良好,但在我的生产服务器上,我不得不将此行添加到 Web 配置中,因为 IIS 正在捕获 404 状态并建立它自己的 404 页面。

        <system.webServer>
            ...
            <httpErrors errorMode="Detailed" />
        </system.webServer>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-07
          • 2010-09-25
          • 2017-03-25
          • 2012-03-21
          相关资源
          最近更新 更多