【问题标题】:MVC Routes - How to skip route rule if controller doesn't exist?MVC Routes - 如果控制器不存在,如何跳过路由规则?
【发布时间】:2013-07-24 18:26:00
【问题描述】:

我希望能够拥有不绑定到控制器的自定义页面。这些自定义页面将全部路由到默认控制器。然后还有其他非自定义的页面正常设置了 Controller 类。我无法让路由规则适用于这两种情况。

我的路由规则如下所示:

    routes.MapRoute( _
        name:="Default", _
        url:="{controller}/{action}", _
        defaults:=New With {.controller = "Home", .action = "Index"} _
    )

    routes.MapRoute( _
         name:="Custom Page", _
         url:="{name}", _
         defaults:=New With {.controller = "Page", .action = "Index"} _
     )

这种情况适用于静态控制器,但不适用于自定义页面。它总是尝试使用不存在的自定义名称 (url:="{name}") 查找控制器,因此出现“找不到资源”错误。

如果我颠倒规则,那么自定义页面可以正常工作,但静态页面不能。

我知道问题在于两个规则相互重叠,所以总是使用第一个规则。理想情况下,我希望能够告诉路由寻找一个名为 X 的控制器,如果它存在,请使用它。如果不存在,则重定向到 Y 控制器并将 X 作为参数传入。现在如果控制器不存在,它不会继续下一个路由规则,它只是说找不到资源。

这样的事情可能吗?

【问题讨论】:

    标签: asp.net-mvc vb.net asp.net-mvc-routing


    【解决方案1】:

    我尚未对此进行测试,但我认为您可能必须使用 {*name},基本上是一条如本答案所示的全部路线 => .Net MVC Routing Catchall not working

    您还需要切换路线,以便最具体地捕获所有信息,如下所示:

    routes.MapRoute( _
         name:="Custom Page", _
         url:="{*name}", _
         defaults:=New With {.controller = "Page", .action = "Index"} _
     )
    
    routes.MapRoute( _
        name:="Default", _
        url:="{controller}/{action}", _
        defaults:=New With {.controller = "Home", .action = "Index"} _
    )
    

    您可能还需要使用 {*catchall} 而不是 {*name},但我不确定。

    【讨论】:

      【解决方案2】:

      这里我提供了一个解决问题的方法。对于每条Route,你可以定义一个替代路由,当路由没有控制器时,会使用替代路由。

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

      线索在最后一行!

      【讨论】:

      • 谢谢!这解决了我的问题。博文中的代码有些不完整,所以任何想要使用它的人都应该阅读这篇文章(以理解它)并获取作者在文章末尾链接到的库。
      猜你喜欢
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 2014-12-19
      • 2016-10-03
      相关资源
      最近更新 更多