带有“可选”路由的MVC路由

时间:2013-05-13 18:41:26

标签: c# asp.net-mvc asp.net-mvc-routing

我对MVC如何计算我的路由详细信息感到有点困惑。让我看看我是否可以解释这一点。

所以...鉴于我有默认路线......

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "CMS", action = "GetPage", id = UrlParameter.Optional }
);

我的应用程序是一个内容管理系统,所以我想从网站结构创建漂亮的网址,所以我将映射一个通配符网址,让我根据数据库中的内容确定是否需要渲染404 ...

routes.MapRoute(
    "CMS",
    "{*path}", 
    new { controller = "CMS", action = "GetPage", path = string.Empty } 
);

这就是问题所在。

MVC基本上会将所有内容与默认路由匹配,因为技术上不需要参数,假设“CMS”控制器上的“GetPage”不需要参数,这不是我想要的。

我想对它说的是“给定2个或3个url部分,查找控制器和动作匹配可选的id参数,但是对于所有其他网址,包括那些你无法匹配的网址路线落入CMS路线“。

我发现这样做的唯一“简单”方法是将第一条路线改为这样的路线......

routes.MapRoute(
    "Default",
    "Get/{controller}/{action}/{id}",
    new { controller = "CMS", action = "GetPage", id = UrlParameter.Optional }
);

然后任何以“Get /”开头的网址都会匹配该路由,所有其他路由会自动落入第二条路线,但这并不是我脑子里的某个地方,我无法弄明白为什么(我认为这是因为它并没有真正解决它只是移动它的问题)。

我的问题是我真的不想要一条路线说“没有任何价值与这条路线相匹配”所以我把它改成了这个......

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}"
);

现在出于一些奇怪的原因,字面上每个请求都会触及所有(不是我想要的但是接近)。

那么有什么想法吗?

编辑:

我更接近这个......

    routes.MapRoute(
        "Default", 
        "{controller}/{action}/{id}", 
        new { id = UrlParameter.Optional}
    );

...但是现在匹配所有带有2个部分“foo / bar”的网址,而不是像它应该到另一个路径那样,因为没有“foo”控制器。

2 个答案:

答案 0 :(得分:0)

好的我有一个解决方案,它适用于我,因为99%的请求需要映射到CMS路由,但在您的情况下,如果您需要映射到很多控制器,它可能不会。

我希望为所有人找到一个理想的解决方案,但这仅仅是我场景中的理想......

假设您(像我一样)只有一个cms控制器和一个帐户控制器,你可以这样做:

    routes.MapRoute("Account", "Account/{action}", new { controller = "Account" });

    routes.MapRoute(
        "Default",
        "{*path}", 
        new { controller = "CMS", action = "GetPage", path = string.Empty } 
    );

这样只有以“帐号”开头的网址才会被第一条规则捕获,其他所有内容都会进入默认路由,并由cms控制器处理。

我计划在添加更多控制器时添加更多路径。它不是一个理想的解决方案,因为它可能意味着我会在长期内获得大量的路由映射,但它足以满足我的需求。

希望它可以帮助其他人。

答案 1 :(得分:0)

也许我完全不了解你的问题,但为什么不这样做呢:

routes.MapRoute(
   "CMS",
   "CMS/{action}/{path}", 
   new { action = "GetPage", path = string.Empty } 
);

并将其添加到路径集合中,然后再显示默认路径...

相关问题