我对 MVC 如何找出我的路由细节感到有些困惑。让我看看我是否可以正确解释这一点。
所以......鉴于我有默认路线......
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "CMS", action = "GetPage", id = UrlParameter.Optional }
);
我的应用程序是一个内容管理系统,所以我想从站点结构创建漂亮的 url,所以我将映射一个通配符 url,让我确定是否需要根据我的数据库中的内容呈现 404 ......
routes.MapRoute(
"CMS",
"{*path}",
new { controller = "CMS", action = "GetPage", path = string.Empty }
);
问题就在这里。
MVC 基本上会将所有内容与默认路由匹配,因为从技术上讲,假设“CMS”控制器上的“GetPage”不需要参数,这不是我想要的。
我想说的是“给定 2 或 3 个 url 部分,查找与可选 id 参数匹配的控制器和操作,但对于所有其他 url,包括您无法与此路由匹配的那些进入 CMS 路线”。
我发现这样做的唯一“简单”方法是将第一条路线更改为这样的东西......
routes.MapRoute(
"Default",
"Get/{controller}/{action}/{id}",
new { controller = "CMS", action = "GetPage", id = UrlParameter.Optional }
);
然后任何以“Get/”开头的 url 都将匹配该路由,所有其他路由自动落入第二条路由,但这并没有在我脑海中的某个地方,我还无法弄清楚为什么(我认为这是因为它并没有真正解决它只是移动它的问题)。
我的问题是我真的不想要一条说“无论如何都没有值匹配这条路线”的路线,所以我把它改成了这个......
routes.MapRoute(
"Default",
"{controller}/{action}/{id}"
);
现在出于某种奇怪的原因,实际上每个请求都被抓住了(不是我想要的,但很接近)。
那么有什么想法吗?
编辑:
我离这个更近了……
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { id = UrlParameter.Optional}
);
...但是现在匹配所有带有 2 部分“foo/bar”的 url,而不是像它应该的那样丢弃到另一条路由,因为没有“foo”控制器。