dotnet core 2 - 捕获所有路线? (* menuPath / pageUrl.html)

时间:2017-12-20 11:48:38

标签: c# routing .net-core

有没有办法使用routeattribute创建一个catch all all route?

在我的网站上,我有预定义的路线,如 /汽车 /保险/最佳

但是,由于我们有一个带有动态菜单和页面网址的CMS,我需要使用无限斜线捕获所有路径。

因此,如果我导航到/whatever/this/is/a/menupath/withapage.html,它应该转到我的Page方法。 withapage.html应该 NOT

我尝试了以下路线,但它不起作用

[Route("{*menuPath}/{pageUrl.html?}")]
public async Task<IActionResult> Page(string menuPath, string pageUrl = null, CancellationToken token = default(CancellationToken))

在MVC 5中,我们将此设置与GreedyRoute一起使用:

    routes.Add(
            new GreedyRoute("{*menuPath}/{pageUrl}",
            new RouteValueDictionary(new { controller = "Page", action = "Index" }),
            new RouteValueDictionary(new { pageUrl = @"[0-9a-zA-ZøæåØÆÅ+_-]+.html" }),
            new MvcRouteHandler()));

        routes.Add(
            new GreedyRoute("{*menuPath}",
            new RouteValueDictionary(new { controller = "Page", action = "List" }),
            new MvcRouteHandler()));

dotnet core 2中有类似内容吗?

1 个答案:

答案 0 :(得分:2)

{*menuPath}是一个catch-all参数,它只能用作路径模板中的最后一个段。

我怀疑使用纯属性路由可以实现您想要的功能。您希望使用任意数量的斜杠捕获URL部分到一个字符串参数,但斜杠对URL和路由具有非常特殊的含义。如果我在你的位置,我会按照以下方式解决它:

[Route("{*menuPathAndPage}")]
public async Task<IActionResult> Page(string menuPathAndPage, CancellationToken token = default(CancellationToken))
{
    var slashPos = menuPathAndPage.LastIndexOf('/');
    var menuPath = slashPos != -1 ? menuPathAndPage.Substring(0, slashPos) : menuPathAndPage;
    var pageUrl = slashPos != -1 ? menuPathAndPage.Substring(slashPos + 1) : String.Empty;

    //  ...
}

嗯,从纯粹主义的角度来看,它可能不是一个完美的解决方案,但这种方法应该适合你。