【发布时间】:2023-03-27 23:53:02
【问题描述】:
我有一个控制器,它提供带有 key 列的“静态页面”,允许输入 URL。例如,http://hostname/about 应路由到名为 StaticPages 的控制器和任何其他不链接到控制器的 URL(无论是否有操作)。
目的是让路由按以下顺序工作:
- 区域路线
- 控制器路由(有/无操作)
- 默认路由 - 通过
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();
});
我怎样才能实现所描述的配置?
【问题讨论】:
-
我认为您无法仅使用路由表来实现这一点。根据您的描述和路由表,
/about和/blog都匹配default和StaticPage-Default路由,后者更适合。我看不到仅通过路由解决此问题的方法-可能在StaticPage控制器中进行了一些额外的工作/重定向,这实际上成为了您的全部。或者,如果只有几个控制器,例如/blog,您可以明确列出它们:pattern: "/blog/{action=Index}/{id?}",或者在每个控制器上使用[Route]属性。我没有看到更好的解决方案...
标签: c# asp.net-core-mvc