我试图在我的一个MVC区域设置一些路由。
我有一个名为AgentGroups
的控制器。我正在努力实现以下目标:
Index
例如,我希望以下工作
/s/agentgroups < (Index action)
/s/agentgroups/1 < (Index action)
/s/agentgroups/someotheraction
/s/agentgroups/someotheraction/1
我目前在我的RegisterArea
方法中有这个:
// s/agentgroups/action
context.MapRoute(
"Suppliers_actions",
"s/{controller}/{action}/{agentgroupid}",
new { controller = "AgentGroups", agentgroupid = UrlParameter.Optional },
new { action = "^(?!Index$).*$" }
);
// s/agentgroups/
context.MapRoute(
"Suppliers_index",
"s/agentgroups/{agentgroupid}",
new { controller = "AgentGroups", action = "Index", agentgroupid = UrlParameter.Optional }
);
这适用于我提供的4个网址示例中的3个,但不能正常工作的是:
/s/agentgroups/1 < (Index action)
我很确定它认为1
参数是一个操作名称,因此它不起作用..? 但确实有效,如果,我像常规查询字符串那样传递参数,即:?agentgroupid=1
,但我想尽可能避免这种情况。
如何更改路线以达到所需的行为?
答案 0 :(得分:1)
您可以重新排序区域路线,因为 Suppliers_index 比 Suppliers_actions 更具体(仅用于索引操作)。然后,您需要为 Suppliers_index 中的 agentgroupid 参数添加约束。
由于参数是可选的并且必须匹配整数,我们可以使用正则表达式\d*
,但对于更复杂的模式,您可能需要创建自己的路径约束为in this answer。
所以您的区域路线可能如下所示:(在您的情况下,名称空间将不同甚至不需要):
context.MapRoute(
"Suppliers_index",
"s/agentgroups/{agentgroupid}",
defaults: new { controller = "AgentGroups", action = "Index", agentgroupid = UrlParameter.Optional },
constraints: new { agentgroupid = @"\d*" },
namespaces: new[] { "WebApplication6.Areas.AgentGroups.Controllers" }
);
context.MapRoute(
"Suppliers_actions",
"s/{controller}/{action}/{agentgroupid}",
defaults: new { controller = "AgentGroups", agentgroupid = UrlParameter.Optional },
namespaces: new[] { "WebApplication6.Areas.AgentGroups.Controllers" }
);