ASP .NET核心:路由。 url中的多个类别在开头

时间:2017-02-19 19:30:41

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

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

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

或更常见:

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

e.g。

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

ArticlesController行动Index(string title)或类似的东西。

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

之类的东西

有可能吗?

1 个答案:

答案 0 :(得分:3)

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

路线是

        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   打算与其他路线相匹配。把贪婪的'路线以后   在路由表中解决这个问题。