【问题标题】:How can I configure ASP.NET Core routing to route to controllers (without optional action) if they exist, then fall back to a default route?如果存在,我如何配置 ASP.NET Core 路由以路由到控制器(没有可选操作),然后回退到默认路由?
【发布时间】:2023-03-27 23:53:02
【问题描述】:

我有一个控制器,它提供带有 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();
        });

我怎样才能实现所描述的配置?

【问题讨论】:

  • 我认为您无法仅使用路由表来实现这一点。根据您的描述和路由表,/about/blog 都匹配 defaultStaticPage-Default 路由,后者更适合。我看不到仅通过路由解决此问题的方法-可能在StaticPage 控制器中进行了一些额外的工作/重定向,这实际上成为了您的全部。或者,如果只有几个控制器,例如/blog,您可以明确列出它们:pattern: "/blog/{action=Index}/{id?}",或者在每个控制器上使用[Route] 属性。我没有看到更好的解决方案...

标签: c# asp.net-core-mvc


【解决方案1】:

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

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();
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    相关资源
    最近更新 更多