Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use an Area in ASP.NET Core

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.

like image 581
Vahid Amiri Avatar asked Apr 10 '16 21:04

Vahid Amiri


People also ask

What is the area in asp net core?

An area is effectively a structure inside an app. In an ASP.NET Core web project, logical components like Pages, Model, Controller, and View are kept in different folders. The ASP.NET Core runtime uses naming conventions to create the relationship between these components.

How do you add an area to a controller?

Step 3: Let us add a controller in Students area by right click on Controllers folder, then Add, Controller. Select MVC 5 Controller - Empty Template, and give name Index. Step 4: Create a view by right click on index, then Add view, and give name to view, here I gave Index. Now click on 'Ok'.

How do you add area to a project?

You can create an area by right-clicking on the project in the solution explorer -> Add -> Area.. , as shown below. Enter the name of an area in the Add Area dialogue box and click on the Add button. This will add an admin folder under the Area folder, as shown below.

What is the use of areas in MVC?

the main use of areas is to physically partition a web project in separate units. if you look into an asp.net mvc project, logical components like model, controller, and the view are kept physically in different folders, and asp.net mvc uses naming conventions to create the relationship between these components.


2 Answers

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/...

like image 83
Vahid Amiri Avatar answered Oct 29 '22 19:10

Vahid Amiri


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?}"); }); 
like image 21
Darío León Avatar answered Oct 29 '22 19:10

Darío León