在我的应用程序中,我有一个区域(XYZ),其中有一个控制器(XYZController)和该区域内的一堆其他控制器。XYZController 具有索引、查看、创建、编辑等一般操作。与某些特定功能相关的更具体的操作在相应的控制器中相应排列。
为了避免 URL 具有如下结构:app/XYZ(area)/XYZ(Controller)/Create,我在 Area 路由注册文件中添加了如下路由。
context.MapRoute(
"XYZ_AreaDefaultControllerActions",
"XYZ/{action}/{id}",
new { controller = "XYZ", id = UrlParameter.Optional },
new { controller = "XYZ" },
new string[] { "App.Web.Areas.XYZ.Controllers.*" }
);
context.MapRoute(
"XYZ_default",
"XYZ/{controller}/{action}/{id}",
new { controller = "XYZ", action = "Index", id = UrlParameter.Optional}
);
此映射将 url:app/XYZ/Create 路由到 area = XYZ、Controller = XYZ 和 Action = Create,这是正确的,也是我想要做的,但会弄乱其他一些 Post 操作的路由。
考虑到这一点,我有另一个名为 Notes 控制器的控制器,它有一些 Post 操作。
当请求是 HTTP Get 并且路由调试器的输出显示第二个路由定义匹配而第一个不匹配时,URL 为 /app/XYZ/Notes/List/id 的操作被正确路由。
当我使用带有 url /App/XYZ/Notes/AddNote 的操作 AddNote 向同一个控制器发布帖子时,第一个路由定义根据路由调试器匹配,因此找不到该操作,因为它需要 Controller = XYZ, Action = 注释,ID = 添加注释。这是路由调试器的输出:
比赛 | 网址 | 默认值 | 约束
真 | XYZ/{action}/{id} | 控制器 = XYZ,ID = | 控制器 = XYZ
真 | XYZ/{控制器}/{动作}/{id} | 控制器 = XYZ,动作 = 索引,id = |(null)
问题是,在 Post 的情况下,第一条路线的约束似乎对它的限制不够,而在 Get 它应用了约束。
有什么建议吗?这里出了什么问题?