我有多个具有不同操作的控制器(没有“索引”操作)。我认为“默认”操作的操作名称不同。 我想为其名称创建默认路由,并且如果路由中仅提供控制器名称,则会执行第一个可用操作(来自我的默认操作列表)。
因此,举例来说,我有以下行动要考虑默认,并希望按此顺序检查它们是否存在于控制器中:
List()
Draw()
ViewSingle()
路由应以某种方式搜索/ {controller},然后将上面列表中的第一个可用操作作为默认操作,例如:
/ControllerA -> ControllerA.List()
/ControllerB -> ControllerB.Draw()
/ControllerC -> ControllerC.ViewSingle()
/ControllerD -> ControllerD.Draw()
/ControllerE -> ControllerE.List()
这可能吗?我尝试创建这样的其他默认操作但无法使其工作:
routes.MapRoute("Default1", "{controller}/{action}",
new { controller = UrlParameter.Optional, action = "List" }
routes.MapRoute("Default2", "{controller}/{action}",
new { controller = UrlParameter.Optional, action = "Draw" }
routes.MapRoute("Default3", "{controller}/{action}",
new { controller = UrlParameter.Optional, action = "ViewSingle" }
帮助?
答案 0 :(得分:3)
我认为你对默认路线有些不对劲。那些控制器和动作参数是符合惯例的。如果URL中包含控制器名称,它将路由到合适的控制器。 Index方法也是如此。它只提供了默认值。它们已经是可选的,这就是原因。我认为你在这里不需要路由:你可以尝试将你的默认函数放在Index方法中,它会起作用。只是要清楚:
public class ControllerA:Controller
{
public ActionResult Index()
{
return List();
}
public ActionResult List()
{
//List function
}
}
public class ControllerB:Controller
{
public ActionResult Index()
{
return Draw();
}
public ActionResult Draw()
{
//Draw function
}
}
我认为它会起作用。但是如果你想继续创建路线,你可以像这样创建每条路线:
routes.MapRoute("Default1", "ControllerA",
new { controller = ControllerA, action = "List" }
请注意,ControllerA不是花括号,而是静态文本。因此,您为每个控制器创建路由。记住控制器命名约定。
答案 1 :(得分:1)
我同意Narsil。你应该给网址写一个常量。类似控制器名称 - 因为MVC无法解析此路由,也无法弄清楚您要显示的内容。
例如
routes.MapRoute(null, "ControllerA/{action}",
new { controller = "ControllerA", action = "List" }
routes.MapRoute(null, "ControllerB/{action}",
new { controller = "ControllerB", action = "Draw" }
routes.MapRoute(null, "ControllerC/{action}",
new { controller = "ControllerC", action = "ViewSingle" }