带约束的ASP.NET核心路由不会回退到默认路由

时间:2017-06-05 10:28:06

标签: asp.net asp.net-mvc asp.net-core routes

我有一个新的ASP.NET Core Web应用程序,其路由定义如下:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "sitemap",
        defaults: new { controller = "Sitemap", action = "Index" },
        template: "sitemap.xml");

    routes.MapRoute(
        name: "cms",
        template: "{*permalink}",
        defaults: new { controller = "Content", action = "Index" },
        constraints: new { permalink = new CmsRouteConstraint() });

    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

当我请求网址/时,我看到我的主页由HomeController提供。当我请求网址/sitemap.xml时,我会看到SitemapController提供的XML。当我请求Match中的CmsRouteConstraint方法返回true的网址时,我看到请求由ContentController处理。

但是,所有其他网址都返回404响应。根据我的理解,这些网址仍应由我的默认路由处理并传递给HomeController,但他们并非如此。我觉得奇怪的是,无论我是否请求网址//where/am/i,我都可以看到CmsRouteConstraint两次都返回false,那么为什么前者最终会被处理HomeController而不是后者?

1 个答案:

答案 0 :(得分:1)

你需要使用你拥有的东西。如果您想要拨打电话/yolo/swag,可以通过deafult路由处理,但您没有yolo控制器并执行swag操作,并且会返回404

还要记住*路线中的cms及其全部路线功能,以便我在路线表末尾使用“贪婪匹配”