【问题标题】:404 page for an ASP.NET MVC applicationASP.NET MVC 应用程序的 404 页面
【发布时间】:2012-04-07 03:04:14
【问题描述】:

这一定很简单并且已经回答了,但是我已经浪费了很多时间。我不知道如何在错误输入的地址上获取错误页面。此外,我不希望重定向,而是保留 URL。我尝试了许多 CustomErrors、HttpErrors 和 Application_Error 的组合,但对于不存在的控制器没有任何作用——取决于 HttpErrors,我总是得到 IIS 404.0 页面或只是一个空的 404 响应。在 IIS 7.5、MVC 3 上运行。

【问题讨论】:

  • How can I properly handle 404 in ASP.NET MVC? 的可能重复项 对于它的价值,这是我使用的方法。最初设置它是一个严重 PIA,而且它确实看起来过于复杂(我倾向于认为它是)-但是...它工作得很好, 非常灵活,你可以精确地得到你想要的。
  • 谢谢上限。柯克 ;) 我会试一试,但恕我直言,对于这样一个常见的场景来说太复杂了......
  • 没关系,该链接提供了 许多 解决方案。如果您正在寻找最简单的解决方案,那就是also been covered

标签: asp.net-mvc-3


【解决方案1】:

我不记得我在哪里得到了解决方案。但这里是处理错误的代码: 首先,创建一个 ErrorController:

public class ErrorController : Controller
{
    //
    // GET: /Error/
    public ActionResult Index()
    {
        return RedirectToAction("Index", "Home");
    }

    public ActionResult Generic()
    {
        Exception ex = null;
        try
        {
            ex = (Exception)HttpContext.Application[Request.UserHostAddress.ToString()];
        }
        catch { }

        return View();
    }

    public ActionResult Error404()
    {            
        return View();
    }
}

其次,打开全局文件,添加如下代码:

protected void Application_Error(object sender, EventArgs e)
{
     Exception ex = Server.GetLastError();
     Application[HttpContext.Current.Request.UserHostAddress.ToString()] = ex;
}

第三,更改 webconfig 中的 customerror:

<customErrors mode="Off" defaultRedirect="/Error/Generic">
  <error statusCode="404" redirect="/Error/Error404"/>
</customErrors>

更多:我又创建了一个错误布局。它使事情更加清楚。 :)

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    我使用以下路由来确保所有不匹配任何其他路由的请求都落到那里,然后你可以很容易地处理这种情况:

            // this route is intended to catch 404 Not Found errors instead of bubbling them all the way up to IIS.
            routes.MapRoute(
                "PageNotFound",
                "{*catchall}",
                new { controller = "Error", action = "NotFound" }
            );
    

    映射最后一个(在任何其他 .MapRoute 语句之后包含该语句)。

    【讨论】:

    • 谢谢 Nico,我实际上是在使用 Snooze URL,我会检查它是否包含所有内容。
    • 这不适用于许多场景。即使找不到任何操作,许多路线也会匹配!这些在技术上是 404。这就是我在评论中推荐这种方法的原因。 (并非巧合地将此解决方案用作处理所有场景的多方面解决方案的一个组件)
    • @Kirk:这个映射的重点是确保任何请求都匹配控制器和操作。不确保任何给定的控制器或动作甚至存在。在我的示例中,我的错误控制器中什至没有真正的 NotFound 操作。但现在我可以自己处理这个错误,而不是冒泡到 IIS。
    • 我的观点是,仅使用您的解决方案无法全面处理 404 错误。我链接到的 duplicate 涵盖了处理 404 错误的所有方面,应该是这个问题的规范答案。
    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 2011-08-03
    • 2015-03-15
    • 1970-01-01
    • 2018-12-20
    • 2010-11-03
    • 2011-02-04
    • 1970-01-01
    相关资源
    最近更新 更多