如何在 ASP.NET 核心中使用区域
How to use an Area in ASP.NET Core
如何在 ASP.NET 核心中使用 Area
?
我有一个需要管理部分的应用程序。此部分要求将其视图放置在该区域中。所有以 Admin/
开头的请求都需要重定向到该区域。
为了在ASP.NET核心应用程序中包含区域,首先我们需要在Startup.cs
文件中包含常规路线(最好将其放在任何非区域路线之前) :
在启动中。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();
}
}
现在,为了使其正常工作,您需要为 return 中的所有操作创建视图。视图的层次结构就像您在非区域视图文件夹中的层次结构一样:
现在,你应该可以开始了!
问题:
如果我想在我的区域内有另一个控制器怎么办?
答案:
只需在 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/...
的风格
脚手架已生成所有文件并添加了所需的依赖项。
但是,应用程序的启动代码可能需要额外的更改才能端到端运行。
将以下代码添加到应用程序启动的 Configure 方法中 class 如果尚未完成:
app.UseMvc(routes =>
{
routes.MapRoute(
name : "areas",
template : "{area:exists}/{controller=Home}/{action=Index}/{id?}");
});
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")]
对我有用。
路由中的区域实现
首先使用VS创建区域(管理员)并将以下代码添加到Startup.cs
第一种实施方式:-
添加控制器登录和索引操作并添加以下代码,[Area(“Admin”)] 必须添加到控制器级别以执行 asp.net 区域路由。
Startup.cs
app.UseMvc(routes =>
{
routes.MapRoute(
name: "areas",
template: "{area:exists}/{controller=Login}/{action=Index}/{id?}"
);
});
注意:区域路由必须放在非区域路由的前面,area:存在是强制添加区域路由的。
控制器代码:
[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");
}
}
调用此路由
在 ASP.NET 核心 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?}");
});
在Microsoft docs to migrate from ASP.NET CORE 2.2 to 3.0建议是:
Replace UseMvc with 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?}");
});
希望我也能帮助你并减少研究时间:-)
在Startup.Cs中的Configure方法中使用此模式作为其完整的路由方式:
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);
在Startup.Cs中的Configure方法中使用此模式作为其完整的路由方式:
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);
如何在 ASP.NET 核心中使用 Area
?
我有一个需要管理部分的应用程序。此部分要求将其视图放置在该区域中。所有以 Admin/
开头的请求都需要重定向到该区域。
为了在ASP.NET核心应用程序中包含区域,首先我们需要在Startup.cs
文件中包含常规路线(最好将其放在任何非区域路线之前) :
在启动中。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();
}
}
现在,为了使其正常工作,您需要为 return 中的所有操作创建视图。视图的层次结构就像您在非区域视图文件夹中的层次结构一样:
现在,你应该可以开始了!
问题: 如果我想在我的区域内有另一个控制器怎么办?
答案:
只需在 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/...
脚手架已生成所有文件并添加了所需的依赖项。
但是,应用程序的启动代码可能需要额外的更改才能端到端运行。 将以下代码添加到应用程序启动的 Configure 方法中 class 如果尚未完成:
app.UseMvc(routes =>
{
routes.MapRoute(
name : "areas",
template : "{area:exists}/{controller=Home}/{action=Index}/{id?}");
});
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")]
对我有用。
路由中的区域实现 首先使用VS创建区域(管理员)并将以下代码添加到Startup.cs 第一种实施方式:- 添加控制器登录和索引操作并添加以下代码,[Area(“Admin”)] 必须添加到控制器级别以执行 asp.net 区域路由。 Startup.cs
app.UseMvc(routes =>
{
routes.MapRoute(
name: "areas",
template: "{area:exists}/{controller=Login}/{action=Index}/{id?}"
);
});
注意:区域路由必须放在非区域路由的前面,area:存在是强制添加区域路由的。
控制器代码:
[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");
}
}
调用此路由
在 ASP.NET 核心 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?}");
});
在Microsoft docs to migrate from ASP.NET CORE 2.2 to 3.0建议是:
Replace UseMvc with 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?}");
});
希望我也能帮助你并减少研究时间:-)
在Startup.Cs中的Configure方法中使用此模式作为其完整的路由方式:
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);
在Startup.Cs中的Configure方法中使用此模式作为其完整的路由方式:
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);