Per Malmstedt
Per Malmstedt

Reputation: 361

How to define an endpoint route to multiple areas

I am trying to define a MapAreaControllerRoute() that routes to multiple Areas. In ASP.NET Core 3.0, however, there is the areaName: parameter that needs to be set, thus restricting each route to a single area. I don't understand how I can use one route that will work for multiple Areas.

I have read through many issues here on Stack Overflow, but it seems that this is a new requirement in ASP.NET Core 3.0. In ASP.NET Core <= 2.2 you could create a MapRoute() without defining a set areaName.

As it is now, in my Startup.cs, I define my endpoints as:

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

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

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

});

Surely, there must be a way to define a single route to cover all Areas?

Upvotes: 12

Views: 16296

Answers (2)

pseudocoder
pseudocoder

Reputation: 4402

You can write a generic pattern for areas using MapControllerRoute():

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

Then the area controllers just need the Area attribute:

[Area("AreaName")]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

Upvotes: 6

Per Malmstedt
Per Malmstedt

Reputation: 361

Ok, so after reading an additional bunch of links, it turns out to be a case of missing attributes for the area controllers! By tagging the controllers with the following tags:

[Area("Area1")]
[Route("Area1/[controller]/[action]")]
public class Area1Controller : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

and changing the routes to:

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

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

everything seems to work as expected.

Upvotes: 16

Related Questions