【问题标题】:How to use an Area in ASP.NET Core如何在 ASP.NET Core 中使用区域
【发布时间】:2016-07-31 20:05:14
【问题描述】:

如何在 ASP.NET Core 中使用 Area

我有一个需要管理部分的应用。此部分要求将其视图放置在该区域中。所有以Admin/ 开头的请求都需要重定向到该区域。

【问题讨论】:

    标签: asp.net-mvc-routing asp.net-core asp.net-core-mvc asp.net-mvc-areas


    【解决方案1】:

    为了在 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是可选的):

    现在我们在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();
        }
    }
    

    现在,为了使其工作,您需要为所有返回一个的操作创建视图。视图的层次结构就像您在非区域视图文件夹中的那样:

    现在,你应该可以走了!

    问题: 如果我在我的区域内有另一个控制器怎么办?

    答案:

    只需在 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/...的风格

    【讨论】:

    • 这是在 RC1、RC2 和 1.0 上测试的。它完全有效。
    • 我创建了一个如上所示的示例并添加了管理区域,它工作正常,但是当我发布我的项目时,它没有发布管理区域以及视图和文件,我该如何处理呢?
    • @motevallizadeh,我的另一个问题! stackoverflow.com/questions/37326068/…
    • 谢谢,在你心中。启动一个真正的/最终的 Web 应用程序的 .net 核心是否稳定?
    • 这对我有用 [Route("")] [Route("Admin")] [Route("Admin/Index")] public IActionResult Index()
    【解决方案2】:

    Scaffolding 已生成所有文件并添加了所需的依赖项。

    但是,应用程序的启动代码可能需要进行额外的更改才能端到端工作。 如果尚未完成,请将以下代码添加到 Application 的 Startup 类中的 Configure 方法中:

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

    【讨论】:

      【解决方案3】:
      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")]
      

      它对我有用。

      【讨论】:

        【解决方案4】:

        路由中的区域实现 首先使用VS创建区域(管理员)并将以下代码添加到Startup.cs 第一种实施方式:- 添加控制器登录和索引操作并添加以下代码,[Area(“Admin”)] 是强制添加到控制器级别以执行 asp.net 区域路由的。 启动.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”Action,并将以下代码添加到新创建的控制器中。

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

        可以使用http://localhost:111/Guest调用此路由

        【讨论】:

          【解决方案5】:

          ASP.NET Core 3.0 中。如果您正在使用端点模式,在添加区域后(右键单击项目,添加,新脚手架项目,区域),您必须在 startup.cs 配置方法中手动添加路由模式。 (此时生成的 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?}");
          });
          

          【讨论】:

          • 这就是我所缺少的。这解决了我的问题。
          【解决方案6】:

          Microsoft docs to migrate from ASP.NET CORE 2.2 到 3.0 中建议:

          将 UseMvc 替换为 UseEndpoints。

          我在尝试修复我的区域时遇到了一些挑战,同时让身份继续工作 - 但下面的解决方案似乎适用于 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?}");
          });
          

          希望我也可以帮助您并减少研究时间:-)

          【讨论】:

            【解决方案7】:

            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);
            

            【讨论】:

              【解决方案8】:

              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);
              

              【讨论】:

                猜你喜欢
                • 2023-03-29
                • 2020-06-14
                • 2020-07-15
                • 1970-01-01
                • 2016-12-18
                • 1970-01-01
                • 1970-01-01
                • 2021-05-04
                • 2022-10-24
                相关资源
                最近更新 更多