我希望能够拥有不绑定到控制器的自定义页面。这些自定义页面将全部路由到默认控制器。然后还有其他非自定义页面,它们将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作为参数传递。现在,如果控制器不存在,它不会继续到下一个路由规则,它只是说找不到资源。
这样的事情可能发生吗?
我还没有测试过这个,但我认为你可能必须使用{*name},基本上是一个catch-all路由,如这个答案所示=>.Net MVC路由Catchall不起作用。
你还需要改变你的路线,这样捕捉到的东西才是最具体的,比如:
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},但我对此不确定。
这里我为这个问题提供了一个解决方案。对于每条路线,您可以定义一条替代路线,如果该路线没有控制器,则将使用该替代路线。
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;
线索在最新的一行!