我必须从以下网址传递用户请求:
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
有可能吗?
答案 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 打算与其他路线相匹配。把贪婪的'路线以后 在路由表中解决这个问题。