如何在 ASP.NET Core 中使用区域
Posted
技术标签:
【中文标题】如何在 ASP.NET Core 中使用区域【英文标题】:How to use an Area in ASP.NET Core 【发布时间】:2016-07-31 20:05:14 【问题描述】:如何在 ASP.NET Core 中使用 Area
?
我有一个需要管理部分的应用。此部分要求将其视图放置在该区域中。所有以Admin/
开头的请求都需要重定向到该区域。
【问题讨论】:
【参考方案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,我的另一个问题! ***.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.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);
【讨论】:
【参考方案8】:在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 Core 中使用区域的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Asp.Net Core 的控制器操作和区域中限制参数类型
ASP.NET Core 2:如何使用区域 RedirectToPage?
使用 Azure 地理冗余 (RA-GRS) 表存储时,如何更新 ASP.NET Core 中的 TableServiceClient 以指向次要区域?
缩短asp.net core 5 Razor页面中区域的路径