ASP.Net MVC 核心 2 - 区域路由



我正在尝试在我的 ASP.Net MVC Core 2应用程序中为管理员实现Area

我已按如下方式配置了该区域的路由:

// Default route
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
// Admin area route
app.UseMvc(routes =>
{
routes.MapRoute(
name: "admin",
template: "{area=Admin}/{controller=Home}/{action=Index}/{id?}");
});

这一切都很好用。

此管理员area使用与主网站相同的Layout,尽管_ViewStart.cshtml位于Areas/Admin/Views目录中,但这仍然可以正常工作。

我遇到的问题是导航菜单组件位于主站点布局文件中,并且在管理区域内所有锚点中的href链接指向错误的 URL。

假设我有以下链接:

<a asp-controller="Account" asp-action="Index">My Account</a>
<a asp-controller="Shopping" asp-action="Basket">Shopping Basket</a>
<a asp-controller="Admin" asp-action="Users">Manage Users</a>

在管理区域内时,链接现在相对于该区域,因此看起来如下所示:

http://localhost/Admin/Account/Index
http://localhost/Admin/Shopping/Basket
http://localhost/Admin/Admin/Users

有什么好方法可以使所有这些链接相对于站点根目录?

如何在应用程序中设置内容有几个问题。

  1. 您不能使用两次app.UseMvc()。我认为基本上最后一个将覆盖您的第一个设置。这就是为什么您看到所有链接都有/admin区域前缀的原因。
  2. 当您想在admin区域下生成指向用户管理的链接时,您应该改用asp-area,例如<a asp-area="admin" asp-controller="users" asp-action="index">Manage Users</a>

这就是我将如何设置区域。

设置区域路由以及启动中的默认路由

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// The area routing setup has to come before your default routing!
// Remember the order of these setups is very important!
// Mvc will use that template as soon as it finds a matching! 
app.UseMvc(routes =>
{
routes.MapRoute(
name: "areaRoute",
template: "{area:exists}/{controller=dashboard}/{action=index}/{id?}"
);
routes.MapRoute(
name: "default",
template: "{controller=home}/{action=index}/{id?}"
);
}

使用[区域]注释设置管理基本控制器,这样就不必在应位于管理区域的所有其他控制器中指定该控制器。

// Assume you have an Admin area under /Areas/Admin
namespace DL.SO.Web.UI.Areas.Admin.Controllers
{
[Area("admin")]
public abstract class AdminControllerBase : Controller
{
}
}

管理区域下的控制器

// Dashboard controller. I know you have home controller inside 
// your admin area but they should work the same.
namespace DL.SO.Web.UI.Areas.Admin.Controllers
{
public class DashboardController : AdminControllerBase
{
public IActionResult Index()
{
return View();
}
}
}
// Users controller. I know you have User(s) controller but I usually
// just keep the name of the controller singular.
namespace DL.SO.Web.UI.Areas.Admin.Controllers
{
public class UserController : AdminControllerBase
{
public IActionResult Index()
{
return View();
}
}
}

使用锚标记帮助程序指定区域

// My habit is to always specify the area with the anchor tag helper.
// For public links (those are not under any areas):
//     I just pass empty string, like asp-area=""
// For links pointing to any controller under any area:
//     Just pass the area, like asp-area="admin"
// http://localhost/account
<a asp-area="" asp-controller="account" asp-action="index">My Account</a>
// http://localhost/shopping/basket
<a asp-area="" asp-controller="shopping" asp-action="basket">Shopping Basket</a>
// http://localhost/admin/user
<a asp-area="admin" asp-controller="user" asp-action="index">Manage Users</a>
// http://localhost/admin/dashboard
<a asp-area="admin" asp-controller="dashboard" asp-action="index">Admin Panel</a>

您可以编辑要显示为首选的 URL 的模板。 即更改为

template: "{controller=Home}/{action=Index}/{id?}");

最新更新