1

我不得不从网址等传递用户请求:ASP .NET核心:路由。多个类别中的URL在begining

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 

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

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

这可能吗?

回答

2

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

这条路线是

 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相匹配。在路由表中放入'贪婪的'路由 来解决这个问题。

+0

该航线将捕获的所有请求,比如'类/ title.html'不仅事 唯一能帮助我的是把这个规则在最后... 感谢 – mokeev1995

+1

这条路线必须到位最后,对。 您可以通过在过滤器中应用正则表达式来过滤'category/title.html'等内容。 'template:“{* query:regex(。+ /。+ \\。html $)}”,'将完美满足您的需求;)(如果运行良好,您也可以提出我的答案:-p) –

+0

不能,我没有足够的信誉... – mokeev1995