没有显示"索引"在URL中并提供MVC5路由的参数

时间:2014-10-10 00:18:01

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

我试图在我的一个MVC区域设置一些路由。

我有一个名为AgentGroups的控制器。我正在努力实现以下目标:

  • 从网址
  • 中删除Index
  • 为索引操作提供参数
  • 允许所有其他操作在URL中显示其名称并为其提供可选参数

例如,我希望以下工作

/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,但我想尽可能避免这种情况。

如何更改路线以达到所需的行为?

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" }
);