2010-05-26 125 views
4

我有多个控制器具有不同的操作(没有“索引”操作)。我认为“默认”操作的操作命名有所不同。 我想为它们的名称创建默认路由,并且只有在路由中提供了控制器名称时,才会执行第一个可用操作(从我的默认操作列表中)。ASP.NET MVC中的多个默认路由到不同的默认操作

因此,举例来说,我有我所要考虑默认并希望在此为了检查它们的存在控制器中的下列行为:

List() 
Draw() 
ViewSingle() 

路由应该以某种方式寻找/ {控制器}然后采取从列表中第一个可用的动作上面默认的动作,如:

/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

为什么要这样做? – 2010-05-26 00:43:42

回答

3

我想你对于默认路由有问题。那些控制器和操作参数是为了约定。如果URL中有控制器名称,它将路由到合适的控制器。索引方法也是如此。它只是提供了一个默认值。他们已经是可选的,这就是为什么。我想,你不需要在这里航线:你可以尝试把您的默认功能指数方法,它会work.Just是明确的:

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

我同意Narsil。你应该写一个常量给url。类似于控制器的名称 - 因为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" }