【问题标题】:Area not present in an URL generated by RedirectToAction and Url.Action after switching to ASP.NET core 3切换到 ASP.NET core 3 后由 RedirectToAction 和 Url.Action 生成的 URL 中不存在区域
【发布时间】:2019-12-20 17:48:42
【问题描述】:

我有一个使用区域的 asp.net core 2.2 应用程序。我使用Url.Action("ActionName") 生成一个操作 URL。这会生成以下格式的 url <area-name>/<controller-name>/<action-name>

我已升级到 .net core 3,升级后生成的 URL 不再包含 <area-name> 部分,仅生成 <controller-name>/<action-name>

我阅读了 3.0 中引入的更改,但没有发现任何有用的内容。

有什么想法吗?

编辑:代码设置

这是在 startup.cs 中设置路由的方式

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "error",
        template: "{controller}/{action}",
        defaults: new { controller = "Error", action = "Error" },
    );

    routes.MapAreaRoute(
        name: "admin",
        areaName: "admin",
        template: "{area}/{controller}/{action}/{id?}",
        defaults: new { area = "admin", action = "index" },
    );

    routes.MapAreaRoute(
        name: "identity",
        areaName: "identity",
        template: "{area}/{controller}/{action}",
        defaults: new { area = "identity", action = "index" }
    );

    routes.MapAreaRoute(
        name: "cmsfront",
        areaName: "cmsfront",
        template: "{*url}",
        defaults: new { controller = "Front", action = "Index" }
    );

    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
    });

以下是 MVC 的设置方式:

services
            .AddMvc(setupAction =>
            {
                setupAction.EnableEndpointRouting = false;
            })
            .SetCompatibilityVersion(CompatibilityVersion.Latest);

这是区域文件夹结构:

【问题讨论】:

  • 您是否在 2.2 中禁用了端点路由?
  • @KirkLarkin 是的,我确实禁用了它,但不是在 2.2 中,我在 3.0 中禁用了它。否则它不会启动,因为我使用app.UseMvc(routes => { ... }); 设置了我的路线,但我没有对路线本身进行任何更改。
  • 您能分享您的 Startup.cs 吗?Area 中的文件夹结构如何?
  • @Rena 我已经更新了原始问题。自 2.2 以来,除了 EnableEndpointRouting = false; 外,没有任何变化

标签: asp.net asp.net-mvc asp.net-core asp.net-core-3.0


【解决方案1】:

你可以使用

<a asp-area="AreaName" asp-page="PageName">Link</a>

应用程序中的任何地方。 如果您已经在区域内的页面上,

<a asp-page="PageName">Link</a>

成功了。

【讨论】:

  • 嗯,我一直在寻找一种方法来自动获取该区域,而无需在任何地方手动指定它。
  • 如果您在该区域内,则无需提及 asp 区域。例如如果您在 /admin/overview 页面上有指向 /admin/logs 的链接,并且该区域是 /admin,则标签 asp-page="Logs" 就可以了。如果你在/admin区域之外,你需要指定asp-area="Admin"。
  • Steinbah,我正在尝试使用 Url.Action("ActionName") 生成链接,我没有使用标签。
  • 我看到了,但阻止您使用标签?
  • 我只需要 URL,不需要 HTML 标签
【解决方案2】:

如下更改routes.MapAreaRoute

routes.MapRoute(
              name: "admin",
              template: "{area=admin}/{controller=Test}/{action=Index}/{id?}");

【讨论】:

    【解决方案3】:

    我发现了问题所在。我正在使用routes.MapRoute 定义第一条路线(用于错误),这导致了问题。我将它移到 routes.MapAreaRoute 定义下面,现在它可以按预期工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 2011-07-03
      • 1970-01-01
      相关资源
      最近更新 更多