3

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

这样的事情可能吗?

4

2 回答 2

0

在这里,我提供了一个解决问题的方法。对于每个 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;

线索在最新的一行!

于 2013-08-08T05:05:17.140 回答
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},但我不确定。

于 2013-07-24T18:32:18.530 回答