【问题标题】:MVC Handle 404s and set default error pageMVC 处理 404s 并设置默认错误页面
【发布时间】:2011-01-02 15:58:00
【问题描述】:

我正在尝试启用 MVC 中的默认路由。

我希望每个 404 请求都重定向到 DefaultController DefaultRout()

我找到How can i make a catch all route to handle '404 page not found' queries for ASP.NET MVC?

但是 {*url} 不起作用,我得到 404 并且没有重定向到默认页面。

我的代码:

public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
  routes.IgnoreRoute("{resource}.ascx/{*pathInfo}");
  routes.IgnoreRoute("{resource}.ashx/{*pathInfo}");
  routes.IgnoreRoute("{resource}.gif/{*pathInfo}");

  //http://localhost:4775/BW/A/Tasks
  routes.MapRoute("Pages", "A/{controller}", new { controller = "Tasks", action = "InitPage" });

  routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "Default", action = "DefaultRout" }
  );
}

我错过了什么?

谢谢

拉斐尔

【问题讨论】:

  • 控制器和动作需要指向实际的控制器和动作,而不是分别指向DefaultDefaultRout
  • 只是为了背靠@Dan,我的回答假设您有一个名为“defaultcontroller”的控制器,带有一个“defaultroute”方法。我通常在“errorcontroller”中使用“notfound”方法
  • 我有一个带有 'defaultroute' 方法的默认控制器,但它永远不会去那里。而且我不想使用 customErrors。

标签: asp.net-mvc model-view-controller


【解决方案1】:

您无法使用您的 web.config 吗?我认为这会更容易:

<customErrors mode="On" defaultRedirect="/error/default">
  <error statusCode="403" redirect="/error/restricted"/>
  <error statusCode="404" redirect="/Default/DefaultRoute"/>
  <error statusCode="500" redirect="/error/problem"/>
</customErrors>

【讨论】:

  • 当你不应该使用它时,有一个小目的,那就是 SEO。当您使用带有默认值的 Web 配置时,客户端会收到一个带有 302 http 标头(重定向)的页面,而不是带有 200 的页面。为了改进爬虫,只需要返回一个带有 404 标头的页面...
【解决方案2】:

我想在这里指出一些事情。

我注意到您对物理文件使用了许多 IgnoreRoute 条目。您不必这样做,因为框架会在默认情况下查找与 url 匹配的物理文件,然后再路由它。您可以通过在 Global.asax 中的 RouteCollection 上将 RouteExistingFiles 设置为 true 来禁用物理文件匹配。在这种情况下,您还没有这样做。

其次,按照您的设置方式,除 /A/{controller} 之外的任何路由都将被您配置的 catch all 路由捕获(任何以 * 开头的都是 catch all 路由)。

我已经尝试过这种配置,它确实捕获了除上述路线之外的所有其他路线。但是,您必须记住的一件事是,上述配置仍将与以下类型的 url 匹配所有内容: /A/something/ 因为第二段将始终匹配 {controller} 占位符。要仅将此 url 与“Tasks”控制器匹配,您可以在路由上定义一个约束,如下所示:

routes.MapRoute("Pages", "A/{controller}", new { controller = "Tasks", action = "InitPage" }, new {controller="Home"});

您的 catch all 路线配置中也存在拼写错误。 action = "DefaultRout" 应该是 action = "DefaultRoute"

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多