【问题标题】:Multiple Default Routes in ASP.NET MVC to different Default ActionsASP.NET MVC 中的多个默认路由到不同的默认操作
【发布时间】:2011-02-23 23:11:45
【问题描述】:

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

因此,例如,我有以下操作要考虑默认,并希望按此顺序检查它们在控制器中是否存在:

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

帮助?

【问题讨论】:

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


    【解决方案1】:

    我认为您对默认路由有误。那些控制器和动作参数是为了约定。如果 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 不在大括号中,它是一个静态文本。因此,您为每个控制器创建路由。请牢记控制器命名约定。

    【讨论】:

      【解决方案2】:

      我同意纳西尔的观点。您应该向 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" } 
      

      【讨论】:

        猜你喜欢
        • 2010-11-01
        • 2012-08-14
        • 2011-08-01
        • 2017-07-08
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多