MVC路由 - 如果控制器不存在,如何跳过路由规则?

时间:2013-07-24 18:26:01

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

我希望能够拥有与控制器无关的自定义页面。这些自定义页面都将路由到默认控制器。然后还有其他页面不是自定义的,正常情况下设置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作为参数。现在,如果控制器不存在,它不会继续下一个路由规则,它只是说无法找到资源。

这样的事情可能吗?

2 个答案:

答案 0 :(得分:0)

我没有对此进行测试,但我认为您可能必须使用{* 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},但我不确定。

答案 1 :(得分:0)

我在这里为问题提供解决方案。对于每条路线,您可以定义替代路线,如果路线没有控制器,将使用替代路线。

   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;

线索是最新的! here是帖子

的链接
相关问题