C# 如何将ASP.NET核心路由配置为路由到控制器(无可选操作)(如果控制器存在),然后返回到默认路由?
我有一个控制器,它为“静态页面”提供一个C# 如何将ASP.NET核心路由配置为路由到控制器(无可选操作)(如果控制器存在),然后返回到默认路由?,c#,asp.net-core-mvc,C#,Asp.net Core Mvc,我有一个控制器,它为“静态页面”提供一个键列,允许输入URL。例如,http://hostname/about应路由到名为StaticPages的控制器和任何其他未链接到控制器的URL(有或无操作) 目的是使布线按以下顺序工作: 区域路线 控制器路由(有/无操作) 默认路由-通过StaticPagescontroller进行静态页面查找 我已配置以下路由,但无法实现上述配置 如果我导航到一个静态页面(即/about),这是可行的,但是如果我导航到一个没有指定操作的控制器(即/blog),我会得到
键
列,允许输入URL。例如,http://hostname/about
应路由到名为StaticPages
的控制器和任何其他未链接到控制器的URL(有或无操作)
目的是使布线按以下顺序工作:
StaticPages
controller进行静态页面查找/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();
});
看起来,将顶部的管理部分转换为一个区域(正确-我没有正确配置),并用下面的代码替换代码,使我能够实现所需的行为,尽管我不完全清楚为什么
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();
});
我不认为仅仅通过路由表就可以实现这一点。根据您的描述和路由表,
/about
和/blog
都匹配default
和StaticPage default
路由,后者更适合。我不认为单靠路由就可以解决这个问题——也许在StaticPage
controller中有一些额外的工作/重定向,这实际上是你的全部。或者,如果只有几个控制器,例如/blog
,则可以显式列出它们:模式:“/blog/{action=Index}/{id?}”
,或者在每个控制器上使用[Route]
属性。我看不到更好的解决方案…我不认为仅仅通过路由表就可以实现这一点。根据您的描述和路由表,/about
和/blog
都匹配default
和StaticPage default
路由,后者更适合。我不认为单靠路由就可以解决这个问题——也许在StaticPage
controller中有一些额外的工作/重定向,这实际上是你的全部。或者,如果只有几个控制器,例如/blog
,则可以显式列出它们:模式:“/blog/{action=Index}/{id?}”
,或者在每个控制器上使用[Route]
属性。我看不到更好的解决方案。。。