asp.net core MVC 区域Areas 下 使用 TagHelper asp-area asp-controller asp-action

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)参考资料

おすすめ

転載: blog.csdn.net/qq1326702940/article/details/82799488