如何配置ASP.NET Core路由以路由到控制器(无需可选操作)(如果存在),然后回退到默认路由



我有一个控制器,它提供带有key列的"静态页面",允许输入URL。例如,http://hostname/about应该路由到名为StaticPages的控制器和任何其他不链接到控制器的URL(有或没有操作(。

其目的是使路线按以下顺序工作:

  1. 区域路线
  2. 控制器路线(有/无动作(
  3. 默认路由-通过StaticPages控制器进行静态页面查找

我配置了以下路由,但我无法实现上述配置。

如果我导航到一个静态页面(即/about(,这是有效的,但是如果我在没有指定操作的情况下导航到控制器(如/blog(,我会得到一个404,这表明它跳过到底部路由模式。如果我使用控制器和操作(即/blog/index(,它可以正常工作,所以它似乎在期待一个操作,我宁愿默认设置为index

app.UseEndpoints(endpoints =>
{
endpoints.MapAreaControllerRoute(
"admin-area",
"admin",
"admin/{controller}/{action}/{Id?}");
endpoints.MapControllerRoute(
name: "admin-users",
pattern: "admin/users/{action=Index}/{Id?}",
defaults: new { controller = "UserAdmin", action = "Index" });

endpoints.MapControllerRoute(
name: "default",
pattern: "{controller}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "StaticPage-Default",
pattern: "{key}",
defaults: new { controller = "StaticPages", action = "Details" });

endpoints.MapRazorPages();
});

如何获得所描述的配置?

似乎,将顶部的管理部分转换为一个区域(正确地-我没有正确地配置(,并用以下代码替换代码,使我能够实现所需的行为,尽管我不完全确定为什么。

app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "admin-area",
pattern: "{area:exists}/{controller=Dashboard}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "StaticPage-Default",
pattern: "{key}",
defaults: new { controller = "StaticPages", action = "Details" });
endpoints.MapRazorPages();
});

相关内容

最新更新