【问题标题】:ASP .NET Core: Routing. Multiple categories in url at beginingASP .NET Core:路由。 url开头的多个类别
【发布时间】:2023-03-18 12:48:01
【问题描述】:

我必须从以下 URL 传递用户请求:

site.com/events/2017/06/wwdc.html

或更常见的:

site.com/category1/subcategory1/subcategory2/...../subcategoryN/page-title.html

例如

site.com/cars/tesla/model-s/is-it-worth-it.html

通过Index(string title) 或类似的操作发送至ArticlesController

在编译时我不知道我会有多少段。但我知道,URL 将以/{pageTitle}.html 结尾。主要问题是默认的asp.net核心路由不允许我写{*}/pageTitle.html

有可能吗?

【问题讨论】:

    标签: asp.net asp.net-core asp.net-core-mvc asp.net-core-1.0 asp.net-core-routing


    【解决方案1】:

    这是可能的,你几乎做到了。

    路线是

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "all",
                    template: "{*query}",
                    defaults: new
                    {
                        controller = "Index",
                        action = "ArticlesController"
                    });
            });
    

    编辑template: "{*query:regex(.+/.+\\.html$)}" 将确保给出至少一个类别并且标题以 .html 结尾

    在控制器的动作中:

        public IActionResult Index(string query)
        {
            string[] queryParts = query.Split(new char[] { '/' });
            string title = queryParts[queryParts.Length - 1];
            string[] categories = queryParts.Take(queryParts.Length - 1).ToArray();
    
            // add your logic about the title and the categories
    
            return View();
        }
    

    documentation

    专用的常规路线通常使用包罗万象的路线参数 像 {*article} 来捕获 URL 路径的剩余部分。这 可以使路由“过于贪婪”,这意味着它与您的 URL 匹配 打算被其他路由匹配。稍后放置“贪婪”路线 在路由表中解决这个问题。

    【讨论】:

    • 该路由将捕获所有请求,而不仅仅是 category/title.html 之类的东西 唯一可以帮助我的是把这条规则放在最后......谢谢
    • 这条路线一定要放在最后吧。您可以通过在过滤器中应用正则表达式来过滤 category/title.html 之类的内容。 template: "{*query:regex(.+/.+\\.html$)}", 将完美地满足您的需求;)(如果效果良好,您也可以投票赞成我的答案:-p)
    • 对,我不知道。我也是 StackOverflow 的新手。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2017-04-06
    • 2022-07-28
    相关资源
    最近更新 更多