如何在ASP.NET Core中使用区域

71

我该如何在ASP.NET Core中使用Area?

我有一个需要添加管理员部分的应用程序。这个部分需要把它的视图放在该区域内。所有以Admin/开头的请求都需要被重定向到该区域。

8个回答

92
为了在ASP.NET Core应用程序中包含一个区域,首先需要在Startup.cs文件中包含一个传统路由(最好将其放置在任何非区域路由之前):
在Startup.cs的Configure方法中:
app.UseMvc(routes =>
{
    routes.MapRoute("areaRoute", "{area:exists}/{controller=Admin}/{action=Index}/{id?}");

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

接下来,在应用程序根目录中创建一个名为Areas的文件夹,并在其中创建另一个名为Admin的文件夹,还要在Admin文件夹内创建这些文件夹(ViewComponent是可选项):

enter image description here

现在我们在Controllers文件夹中创建一个名为AdminController的控制器,内容可以如下:

[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();
    }
}
为了使这个工作,您需要为返回视图的所有操作创建视图。视图的层次结构与非区域视图文件夹中的层次结构相同: enter image description here 现在,您应该准备好了! 问题:如果我想在我的区域内部有另一个控制器怎么办? 答案: 只需在AdminController旁边添加另一个控制器,并确保路由如下所示:
[Area("Admin")]
[Route("admin/[controller]")]
public class ProductsController : Controller
{
    public ProductsController()
    {
        //
    }

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

重要的部分是[Route("admin/[controller]")]。有了它,你可以保持路由的风格为admin/controller/action/...


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - motevalizadeh
谢谢。在你的想法中,.NET Core是否稳定,可以开始一个真正/最终的Web应用程序? - motevalizadeh
非常感谢您分享您的知识。 - motevalizadeh
使用区域的重点不是更多地与组织和结构有关,而不是安全性吗?因为我仍然没有看到使用区域的其他原因。 - Johan Herstad
1
这对我有用 [Route(“”)] [Route(“Admin”)] [Route(“Admin / Index”)] public IActionResult Index() - Sachin Pakale
显示剩余13条评论

42
在ASP.NET Core 3.0中,如果您正在使用终结点模式(Endpoint patterns),在添加区域(右键单击项目,添加,新的脚手架项,区域)后,您必须在startup.cs Configure方法中手动添加路由模式。(此时生成的ScaffoldingReadMe.txt已过时)。
app.UseEndpoints(endpoints =>
{

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

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

1
这就是我所缺失的。这解决了我的问题。 - Shuaib

10
Microsoft文档中,从ASP.NET CORE 2.2到3.0的迁移建议如下:

用UseEndpoints替换UseMvc。

我在尝试修复我的区域时遇到了一些挑战,同时需要运行Identity,但是以下解决方法似乎适用于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?}");
});

希望我也能帮助你,缩短研究时间 :-)

5

脚手架生成了所有文件并添加了所需的依赖。

然而,为了使一切正常工作,应用程序的启动代码可能需要进行额外的更改。如果尚未完成,请在应用程序的启动类中的Configure方法中添加以下代码:

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

4

路由中的区域实现 首先使用VS创建区域(Admin),并将以下代码添加到Startup.cs中 第一种实现方式:- 添加控制器登录和Index操作,并添加以下代码,[Area("Admin")]在控制器级别上是必须添加的,以执行asp.net区域路由。 Startup.cs

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

注意:区域路由必须先放置非区域路由之前,添加区域路由必须强制包含"area: exists"。 控制器代码:
[Area("Admin")] 
    public class LoginController : Controller
    {
        public IActionResult Index()
        {
            return Content("Area Admin Login Controller and Index Action");
        }
    }

这个路由可以使用 http://localhost:111/Admin 来调用。

实现区域路由的第二种方式: 将以下代码添加到startup.cs文件中。

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

创建一个名为“Guest”的区域,添加“GuestLogin”控制器和“Index”动作,并将下面的代码添加到新创建的控制器中。
[Area("Guest")]
    public class GuestLoginController : Controller
    {
        public IActionResult Index()
        {
            return Content("Area Guest Login Controller and Index Action");
        }
    }

该路由可以使用http://localhost:111/Guest进行调用。

1
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")]

对我来说它有效。


1

Startup.CsConfigure 方法中使用此模式,作为其完整的路由方式:

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

在Core 3.1中,您应该在ConfigureServices方法中使用下面的代码:
services.AddMvc(option => option.EnableEndpointRouting = false);

0

Startup.CsConfigure方法中使用此模式,作为其完整路由方式:

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

在 Core 3.1 中,您应该在 ConfigureServices 方法中使用以下代码:
services.AddMvc(option => option.EnableEndpointRouting = false);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接