1)在 ~/Areas/区域名称/Views 目录下 新建 _ViewImports.cshtml 文件
2)路由配置信息
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
// 区域路由
routes.MapRoute(
name: "areas",
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
);
});
3)视图
<form class="layui-form" asp-area="Admin" asp-controller="Blog" asp-action="CategoryAdd" data-ajax-success="onSuccess" data-ajax="true" data-ajax-method="POST"></form>
4)TagHelper 根据路由匹配规则,解析得到的路径为 /Blog/CategoryAdd?area=Admin,
很明显,这不是正确的,路由规则匹配成了这个 routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
5)这时,我们得调整下路由的注册顺序,因为路由匹配是按顺序地成功匹配到的第一个,把 区域 的路由放到第一个
app.UseMvc(routes =>
{
// 匹配所有的区域 需要在对应Controller 上添加区域属性 如:[Area("Admin")]
// 把 Area的路由放在第一位,会保证 在 Areas 下的视图,使用 TagHelper 时候,
// 使用 asp-area asp-controller asp-action 能正确的匹配上
// 如果不把这个路由放在这里,当你的Areas下的视图的路径 和 非Areas 目录下的视图
// asp-controller asp-action 一样时,会匹配第一个能合适的路由
// 而这时,你在 Areas 下的视图,就没有匹配到正确的路径
routes.MapRoute(
name: "areas",
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
);
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
6)这样就得到了正确的路径
注:在路由配置正确的前提下,form 表单里,只写 asp-action 的时候,可以不用写 asp-are 和 asp-controller,框架代码默认会查到当前所在的 区域(Areas) 和 控制器(Controller) 下 对应的 Action
7)参考资料