【发布时间】:2012-07-28 02:29:49
【问题描述】:
在我的应用程序中,我有一个区域 (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 = Notes,Id = AddNote。 这是路由调试器的输出:
匹配 |网址 |默认值 |约束
是的 | XYZ/{action}/{id} |控制器 = XYZ,ID = |控制器 = XYZ
是的 | XYZ/{控制器}/{动作}/{id} |控制器 = XYZ,动作 = 索引,id = |(null)
问题在于,在 Post 的情况下,第一条路线的约束似乎对它的限制不够,而在 Get 中它应用了约束。
有什么建议吗?
【问题讨论】: