ASP.NET MVC - 捕获所有路由和默认路由

Sea*_*lor 70 asp.net-mvc asp.net-mvc-2

在尝试让我的应用程序正确生成404错误时,我在路由表的末尾实现了catch all route,如下所示:

 routes.MapRoute(
            "NotFound", _
           "{*url}", _
           New With {.controller = "Error", .action = "PageNotFound"} _
       )
Run Code Online (Sandbox Code Playgroud)

但是,为了使这个工作,我不得不删除默认路由:

{controller}/action/{id}
Run Code Online (Sandbox Code Playgroud)

但是现在已经删除了默认设置,我的大部分操作链接都不再有效,而我找到让它们再次工作的唯一方法是为每个控制器/操作添加单独的路由.

是否有更简单的方法,而不是为每个控制器/操作添加路由?

是否可以创建一个默认路由,如果用户尝试导航到未知路由,仍然允许捕获所有路由?

Rob*_*nik 104

使用路线约束

在您的情况下,您应该定义默认路由{controller}/{action}/{id}并对其进行约束.可能与控制器名称或甚至动作有关.然后把它全部放在它之后它应该工作得很好.

因此,当有人要求资源失败时,catch-all路径将匹配请求.

所以.首先使用路由约束定义默认路由,然后在之后捕获所有路由:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new { controller = "Home|Settings|General|..." } // this is basically a regular expression
);
routes.MapRoute(
    "NotFound",
    "{*url}",
    new { controller = "Error", action = "PageNotFound" }
);
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用反射来构建控制器约束,从而避免每次添加新控制器时的维护负担.`private static string GetAllControllersAsRegex(){var controllers = typeof(MvcApplication).Assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(Controller))); var controllerNames = controllers.Select(c => c.Name.Replace("Controller","")); return string.Format("({0})",string.Join("|",controllerNames)); }` (13认同)

Pra*_*sad 22

//this catches all  requests
routes.MapRoute(
    "Error",
    "{*.}",
     new { controller = "PublicDisplay", action = "Error404" } 
);
Run Code Online (Sandbox Code Playgroud)

在路由表的末尾添加此路由

  • 当然这可以满足所有要求.但是如果你在默认路由之前声明它,它将覆盖默认路由,如果你在默认路由之后声明它,它将不会被调用,因为默认路由捕获了请求. (5认同)
  • `“ {*。*}”,`在asp.net vb上为我工作 (2认同)

Haa*_*ked 7

啊,问题是你的默认路由捕获所有3段网址.这里的问题是路由在我们确定谁将处理请求之前运行.因此,任何三个段URL都将匹配默认路由,即使它稍后结束,没有控制器来处理它.

您可以做的一件事是在您的控制器上覆盖HandleMissingAction方法.您还应该使用标记来捕获所有404问题.