【问题标题】:dotnet core 2 - catch all route? (*menuPath/pageUrl.html)dotnet core 2 - 捕获所有路由? (*menuPath/pageUrl.html)
【发布时间】:2018-06-02 23:24:57
【问题描述】:

有什么方法可以使用 routeattribute 来创建 catch all 路由吗?

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

但是,由于我们有一个带有动态菜单和页面 url 的 CMS,我需要一条带有无限斜线的全部路径。

所以如果我导航到 /whatever/this/is/a/menupath/withapage.html 它应该转到我的 Page 方法。 withapage.html 应该是必需的。

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

[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 中有类似的东西吗?

【问题讨论】:

    标签: c# routing .net-core


    【解决方案1】:

    {*menuPath} 是一个包罗万象的参数,它只能用作路由模板中的最后一段。

    我怀疑使用纯属性路由是否可以实现您想要的。您想用任意数量的斜杠捕获 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;
    
        //  ...
    }
    

    好吧,从纯粹主义者的角度来看,这可能不是完美的解决方案,但是这种方法应该适合您。

    【讨论】:

    • 是的,我最终确实这样做了。但我认为这很奇怪,很少有人问这个问题。人们通常如何生成菜单路径和网址?
    • 我主要使用 Web API,所以我无法回答您的问题,人们通常如何为菜单路径解决这个问题。也许他们将路径作为查询参数传递,或者通过一些共享的基本控制器类为不同的菜单路径使用不同的控制器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2011-04-29
    • 2015-12-31
    相关资源
    最近更新 更多