ASP.NET MVC中的多个默认路由到不同的默认操作

时间:2010-05-26 00:35:02

标签: c# asp.net-mvc routing routes asp.net-mvc-routing

我有多个具有不同操作的控制器(没有“索引”操作)。我认为“默认”操作的操作名称不同。 我想为其名称创建默认路由,并且如果路由中仅提供控制器名称,则会执行第一个可用操作(来自我的默认操作列表)。

因此,举例来说,我有以下行动要考虑默认,并希望按此顺序检查它们是否存在于控制器中:

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

帮助?

2 个答案:

答案 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" }