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)参考资料
本文详细介绍了在ASP.NET中如何正确配置区域路由,确保在使用TagHelper时,能够准确匹配到Areas下的视图路径。通过调整路由注册顺序,使区域路由优先匹配,解决了路径错误的问题。
118

被折叠的 条评论
为什么被折叠?



