【问题标题】:MVC 5 Catch All not workingMVC 5 Catch All 不起作用
【发布时间】:2017-05-12 21:18:52
【问题描述】:

我无法找到在 MVC 中工作的所有路线。我试图实现question 中显示的内容,但它不起作用。我有一个名为 OnlineController 的控制器,带有一个 Index 操作。我的 RouteConfig.cs 是这样设置的:

        public static void RegisterRoutes(RouteCollection routes)
        {
             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
             routes.MapMvcAttributeRoutes();

             AreaRegistration.RegisterAllAreas();

             routes.MapRoute(
                 name: "Default",
                 url: "{controller}/{action}/{id}",
                 defaults: new { controller = "Home", action = "Index", id = 
                 UrlParameter.Optional }
            );

            routes.MapRoute("RouteName", "{*url}", new { controller = 
                       "Online", action = "Index" });
         }

浏览到以下网址

块引用http://mysite/online/something

给出 404。为什么它没有被捕获并重定向到 Online 控制器上的 index 操作?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    如果你想捕获所有路由,你应该删除"Default" route:

    public static void RegisterRoutes(RouteCollection routes)
    {
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
         routes.MapMvcAttributeRoutes();
    
         AreaRegistration.RegisterAllAreas();
    
         routes.MapRoute("RouteName", "{*url}", new { controller = "Online", action = "Index" });
    }
    

    路由是按照它们被映射的顺序选择的,并且您的 url 匹配 "Default" 路由。

    如果您想为现有的控制器和操作捕获一些路由,您可以使用您的 "Default" 路由,但有限制:

    public static void RegisterRoutes(RouteCollection routes)
    {
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
         routes.MapMvcAttributeRoutes();
    
         AreaRegistration.RegisterAllAreas();
    
         routes.MapRoute(
             name: "Default",
             url: "{controller}/{action}/{id}",
             defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
             constraints: new { controller = "Home|Home2", action = "Index|Index2"}
            );
    
        routes.MapRoute("RouteName", "{*url}", new { controller = 
                       "Online", action = "Index" });
     }
    

    现在,如果您的控制器名称是 "Home""Home2" 并且动作名称是 "Index""Index2" 这些路由将由现有控制器和动作处理,如果其他名称 - 由 "Online" 控制器处理

    【讨论】:

    • 有没有办法做到这一点,但仍然捕获已经存在的控制器的路由?
    猜你喜欢
    • 2010-11-29
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多