有没有办法使用routeattribute创建一个catch all all route?
在我的网站上,我有预定义的路线,如 /汽车 /保险/最佳
但是,由于我们有一个带有动态菜单和页面网址的CMS,我需要使用无限斜线捕获所有路径。
因此,如果我导航到/whatever/this/is/a/menupath/withapage.html,它应该转到我的Page方法。 withapage.html应该 NOT 。
我尝试了以下路线,但它不起作用
[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中有类似内容吗?
答案 0 :(得分:2)
{*menuPath}
是一个catch-all参数,它只能用作路径模板中的最后一个段。
我怀疑使用纯属性路由可以实现您想要的功能。您希望使用任意数量的斜杠捕获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;
// ...
}
嗯,从纯粹主义的角度来看,它可能不是一个完美的解决方案,但这种方法应该适合你。