如何在ASP.NET Core中设置默认区域?

9

我正在使用ASP.NET Core 3.1应用程序(MVC)中的区域。

现在,我希望所有没有明确区域的请求默认都进入“Main”区域。以下是我当前设置的端点路由:

app.UseEndpoints(endpoints =>
{
    // 1
    endpoints.MapControllerRoute(
        name: "area",
        pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

    // 2
    endpoints.MapAreaControllerRoute(
                       name: "default",
                       areaName: "Main",
                       pattern: "{area=Main}/{controller=Home}/{action=Index}/{id?}");
});

我的目标是:

如果请求的URL包含一个已存在的区域名,则使用路由[1]。如果没有区域名,则使用路由[2](默认为“Main”区域)。

我的问题:

  • 对“/main/admin”发出的请求可以正常工作。
  • 对“/admin”发出的请求结果为404错误。

如何设置默认区域?

好的,问题已解决。最终,以下内容适用于我:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
               name: "default",
               pattern: "area:exists}/{controller=Home}/{action=Index}/{id?}");


     endpoints.MapAreaControllerRoute(
                name: "default",
                areaName: "Main",
                pattern: "{controller=Home}/{action=Index}/{id?}");
 });
2个回答

8
有两种方式:
  1. 如果您没有指定区域名称,它将在区域外部找到 ControllerAction。此外,重要的区域 应该在 Areas 外部,以使其像默认区域一样正常运行。

enter image description here

    app.UseEndpoints(endpoints =>
    {

        // 1
        endpoints.MapControllerRoute(
            name: "area",
            pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

        // 2
        endpoints.MapAreaControllerRoute(
                           name: "default",
                           pattern: "{controller=Home}/{action=Index}/{id?}");

    });
  1. 移除您的模式中多余的 {area=Main}/
app.UseMvc(routes =>
{
   routes.MapControllerRoute(
      name: "area",
      template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

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

请参考以下主题以更好地理解: ASP.NET Core 2默认路由有区域

感谢您的帮助,Phong。您的下面的代码片段无法编译。而上面的代码仍然导致404错误。我认为我需要从最具体的路由开始,然后再进行更一般的路由。在您的代码片段中,我觉得您做的是相反的,不是吗? - Ingmar
你如何指定路由以在Area之外获取ControllerAction。这就是我的问题。 - Nguyễn Văn Phong
嗯,我的控制器之外没有任何区域。因此,我拥有的所有内容都包含在区域中。然而,有一个区域比我其他所有区域更重要。我的目标是,如果 URL 中没有任何区域,则路由到这个重要的区域。 - Ingmar
1
哈哈,是的。但我现在不想改变一切。谢谢Phong。仍在寻找让它按我的方式工作的方法。 - Ingmar
你试过这个吗?https://dev59.com/Gajja4cB1Zd3GeqP-GVz - Nguyễn Văn Phong
显示剩余2条评论

1
尝试使用以下路由配置:

app.UseEndpoints(endpoints =>
{

    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
    );
    endpoints.MapAreaControllerRoute(
        name: "Main",
        areaName: "Main",
        pattern: "{controller=Home}/{action=Index}/{id?}"
    );

});

谢谢@Xing Zou,但这并没有解决问题。对“/admin”的请求仍然返回404错误。 - Ingmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接