How to use an Area in ASP.NET Core

asp.net Mvc-Routingasp.net Coreasp.net Core-Mvcasp.net Mvc-Areas

asp.net Mvc-Routing Problem Overview


How do I use an Area in ASP.NET Core?

I have an app that needs an Admin section. This section requires its Views to be placed in that area. All requests that start with Admin/ will need to be redirected to that area.

asp.net Mvc-Routing Solutions


Solution 1 - asp.net Mvc-Routing

In order to include an Area in an ASP.NET Core app, first we need to include a conventional route in the Startup.cs file (It's best to place it before any non-area route):

In Startup.cs/Configure method:

app.UseMvc(routes =>
{
	routes.MapRoute("areaRoute", "{area:exists}/{controller=Admin}/{action=Index}/{id?}");

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

Then make a folder named Areas in the app root and make another named Admin inside the former, also make these folders inside Admin (ViewComponent is optional):

enter image description here

Now we create a controller inside the Controllers folder named AdminController, the content can be like:

[Area("Admin")]
[Route("admin")]
public class AdminController : Controller
{
	public AdminController()
	{
		// do stuff
	}

	public IActionResult Index()
	{
		return View();
	}

	[Route("[action]/{page:int?}")]
	public IActionResult Orders()
	{
		return View();
	}

	[Route("[action]")]
	public IActionResult Shop()
	{
		return View();
	}
	
	[Route("[action]/newest")]
	public IActionResult Payments()
	{
		return View();
	}
}

Now in order for that to work, you'll need to create Views for all actions that return one. The hierarchy for views is just like what you have in a non-area Views folder:

enter image description here

Now, you should be good to go!

Question: What if I want to have another controller inside my Area?

Answer:

Just add another controller beside AdminController and make sure the routes are like the following:

[Area("Admin")]
[Route("admin/[controller]")]
public class ProductsController : Controller
{
	public ProductsController()
	{
		//
	}

	[Route("{page:int?}")]
	public IActionResult Index()
	{
		return View();
	}
}

The important part is [Route("admin/[controller]")]. With that you can keep the style of routing to admin/controller/action/...

Solution 2 - asp.net Mvc-Routing

In ASP.NET Core 3.0. If you are working with Endpoint patterns, after adding the Area (Right click over project, Add, New Scaffolded Item, Area), you have to add manually routing pattern on startup.cs Configure method. (At this point the generated ScaffoldingReadMe.txt is out of date).

app.UseEndpoints(endpoints =>
{

    endpoints.MapAreaControllerRoute(
        "Admin",
        "Admin",
        "Admin/{controller=Home}/{action=Index}/{id?}");

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

Solution 3 - asp.net Mvc-Routing

In the Microsoft docs to migrate from ASP.NET CORE 2.2 to 3.0 the suggestion is to:

> Replace UseMvc with UseEndpoints.

I encountered some challenges while trying to fix my Area's while simultaneously having Identity to keep working - but the solution below seems to be working for ASP.NET CORE 3.0 :

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

Hopefully I could also help you out and reduce the research time :-)

Solution 4 - asp.net Mvc-Routing

Scaffolding has generated all the files and added the required dependencies.

However the Application's Startup code may required additional changes for things to work end to end. Add the following code to the Configure method in your Application's Startup class if not already done:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name : "areas",
        template : "{area:exists}/{controller=Home}/{action=Index}/{id?}");
});

Solution 5 - asp.net Mvc-Routing

Areas Implementation in Routing First Create Area(Admin) using VS and add the following code into Startup.cs First Way to Implement:- Add Controller Login and Index Action and add Following Code, [Area(“Admin”)] is compulsory to add on controller level to perform asp.net areas Routing. Startup.cs

 app.UseMvc(routes =>
            {
                routes.MapRoute(
                  name: "areas",
                  template: "{area:exists}/{controller=Login}/{action=Index}/{id?}"
                );
            });

Note: Area routing must be placed first with non area routing, area: exists is compulsory to add area routing.

Controller Code:

[Area("Admin")] 
    public class LoginController : Controller
    {
        public IActionResult Index()
        {
            return Content("Area Admin Login Controller and Index Action");
        }
    }

This route may be called using http://localhost:111/Admin

Second Way to Implement Area Routing:- Add Following code into startup.cs.

app.UseMvc(routes =>
            {
                routes.MapAreaRoute(
    name: "default",
    areaName: "Guest",
    template: "Guest/{controller}/{action}/{id?}",
    defaults: new { controller = "GuestLogin", action = "Index" });
            });

Create an Area “Guest”, Add “GuestLogin” Controller and “Index” Action and add the following code into the newly created controller.

[Area("Guest")]
    public class GuestLoginController : Controller
    {
        public IActionResult Index()
        {
            return Content("Area Guest Login Controller and Index Action");
        }
    }

This route may be called using http://localhost:111/Guest

Solution 6 - asp.net Mvc-Routing

Use this pattern in Configure method in Startup.Cs, as its full routing manner:

app.UseMvc(routes =>{
   routes.MapRoute(
   name: "MyArea",
   template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

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

In Core 3.1 you should use below code in ConfigureServices method:

services.AddMvc(option => option.EnableEndpointRouting = false);

Solution 7 - asp.net Mvc-Routing

With .net core, following is needed to be added in the startup file if you are adding an area:

     app.UseMvc(routes =>
            {
                routes.MapRoute(
                  name: "areas",
                  template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
                );
            });

After that you can just simply mark your area and route in the controller, i.e
     [Area("Order")]
     [Route("order")]

it works for me.

Solution 8 - asp.net Mvc-Routing

Use this pattern in Configure method in Startup.Cs, as its full routing manner:

app.UseMvc(routes =>{

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

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

In Core 3.1 you should use below code in ConfigureServices method:

services.AddMvc(option => option.EnableEndpointRouting = false);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVahid AmiriView Question on Stackoverflow
Solution 1 - asp.net Mvc-RoutingVahid AmiriView Answer on Stackoverflow
Solution 2 - asp.net Mvc-RoutingDarío LeónView Answer on Stackoverflow
Solution 3 - asp.net Mvc-Routingdewilde.itView Answer on Stackoverflow
Solution 4 - asp.net Mvc-RoutingElnazView Answer on Stackoverflow
Solution 5 - asp.net Mvc-RoutingYogesh SharmaView Answer on Stackoverflow
Solution 6 - asp.net Mvc-RoutingAlireza AbdollahnejadView Answer on Stackoverflow
Solution 7 - asp.net Mvc-Routingmukesh joshiView Answer on Stackoverflow
Solution 8 - asp.net Mvc-RoutingAlireza AbdollahnejadView Answer on Stackoverflow