我该如何在ASP.NET Core中使用Area
?
我有一个需要添加管理员部分的应用程序。这个部分需要把它的视图放在该区域内。所有以Admin/
开头的请求都需要被重定向到该区域。
我该如何在ASP.NET Core中使用Area
?
我有一个需要添加管理员部分的应用程序。这个部分需要把它的视图放在该区域内。所有以Admin/
开头的请求都需要被重定向到该区域。
Startup.cs
文件中包含一个传统路由(最好将其放置在任何非区域路由之前):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();
}
}
为了使这个工作,您需要为返回视图的所有操作创建视图。视图的层次结构与非区域视图文件夹中的层次结构相同:
[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/...
app.UseEndpoints(endpoints =>
{
endpoints.MapAreaControllerRoute(
"Admin",
"Admin",
"Admin/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
我在尝试修复我的区域时遇到了一些挑战,同时需要运行Identity,但是以下解决方法似乎适用于ASP.NET CORE 3.0:用UseEndpoints替换UseMvc。
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllerRoute("areas", "{area:exists}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
});
脚手架生成了所有文件并添加了所需的依赖。
然而,为了使一切正常工作,应用程序的启动代码可能需要进行额外的更改。如果尚未完成,请在应用程序的启动类中的Configure方法中添加以下代码:
app.UseMvc(routes =>
{
routes.MapRoute(
name : "areas",
template : "{area:exists}/{controller=Home}/{action=Index}/{id?}");
});
路由中的区域实现 首先使用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("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" });
});
[Area("Guest")]
public class GuestLoginController : Controller
{
public IActionResult Index()
{
return Content("Area Guest Login Controller and Index Action");
}
}
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")]
对我来说它有效。
在 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?}");});
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?}");});
services.AddMvc(option => option.EnableEndpointRouting = false);