Ingmar
Ingmar

Reputation: 1437

How to set the default area in ASP.NET Core?

I am using areas in my ASP.NET Core 3.1 application (MVC).

Now I want all requests without an explicit area to go to the "Main" area by default. This is how I currently set up my endpoint routing:

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

My goal is:

If the request URL contains an existing area name, use routing [1]. If there is no area name, use routing [2] (which defaults to the "Main" area).

My problem:

How do I set up the default area?

OK, solved. In the end, this here has been working for me:

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

Upvotes: 10

Views: 8026

Answers (2)

Nguyễn Văn Phong
Nguyễn Văn Phong

Reputation: 14198

There are 2 ways:

  1. If you do not specify the area name, it'll find the Controller and Action outside the Areas. Besides, The Important Area should be outside Areas to make it as normal (Default Area) as you wish.

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. Remove redundant {area=Main}/ in your pattern
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?}");
   });

Refer the following thread to have a better understanding

ASP.NET Core 2 default route having areas

Upvotes: 9

Ryan
Ryan

Reputation: 20106

Try to use below routing configuration:

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

});

Upvotes: 1

Related Questions