如何在ASP.NET Core中使用Area

Vah*_*iri 50 asp.net-mvc-routing asp.net-mvc-areas asp.net-core-mvc asp.net-core

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

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

Vah*_*iri 75

为了在ASP.NET Core应用程序中包含Area,首先我们需要在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?}");
});
Run Code Online (Sandbox Code Playgroud)

然后创建一个Areas在app root中命名的文件夹,并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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

现在,你应该好好去!

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

回答:

只需在旁边添加另一个控制器,AdminController并确保路由如下所示:

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

    [Route("{page:int?}")]
    public IActionResult Index()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

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


小智 37

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?}");
});
Run Code Online (Sandbox Code Playgroud)


小智 8

Microsoft docs to migrate from ASP.NET CORE 2.2 to 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?}");
});
Run Code Online (Sandbox Code Playgroud)

希望我也能帮助你并减少研究时间:-)


Eln*_*naz 5

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

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

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