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



我希望能够拥有不绑定到控制器的自定义页面。这些自定义页面将全部路由到默认控制器。然后还有其他非自定义页面,它们将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;

线索在最新的一行!

相关内容

  • 没有找到相关文章

最新更新