【问题标题】:How to set the default area in ASP.NET Core?如何在 ASP.NET Core 中设置默认区域?
【发布时间】:2020-06-14 12:07:09
【问题描述】:

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

现在我希望所有没有明确区域的请求都默认转到“主要”区域。这是我目前设置端点路由的方式:

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/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?}");
 });

【问题讨论】:

    标签: c# asp.net-core attributerouting asp.net-core-routing


    【解决方案1】:

    有两种方式:

    1. 如果不指定区域名称,它将在区域之外找到ControllerAction。除了, 重要区域应位于Areas 之外,以使其如您所愿正常(默认区域)。

        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 default route having areas

    【讨论】:

    • 感谢您的帮助,Phong。您的较低 sn-p 无法编译。上部通向 404 仍然。我想,我需要从最具体的路线开始,然后再从更一般的路线开始。在你的 sn-ps 中,我觉得你在做相反的事情,不是吗?
    • 如何指定路由获取ControllerActionArea。这就是我的观点。 ibb.co/hcF1XMn
    • 嗯。好吧,我在区域外没有控制器。所以我所拥有的一切都包裹在区域中。但是,有一个区域比我所有其他区域更重要。如果 url 中没有区域,我的目标是路由到这个重要区域。
    • 很明显,重要区域应该在外面才能正常(默认区域)。
    • 哈哈,是的。但我现在不想改变一切。谢谢庞。仍在寻找一种方法让它按我的方式工作。
    【解决方案2】:

    尝试使用以下路由配置:

    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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2021-12-29
    • 2018-09-14
    • 2019-06-09
    相关资源
    最近更新 更多