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