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

时间:2018-05-16 16:22:51

标签: c# asp.net-mvc asp.net-core-2.0

我正在尝试在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

有没有很好的方法来制作相对于网站根目录的所有这些链接?

2 个答案:

答案 0 :(得分:4)

您在应用程序中设置的方式有几个问题。

  1. 您无法使用app.UseMvc()两次。我认为基本上最后一个将覆盖你的第一个设置。这就是为什么您看到所有链接都有/admin区域前缀。
  2. 如果要在admin区域下生成指向用户管理的链接,则应使用asp-area,而不是<a asp-area="admin" asp-controller="users" asp-action="index">Manage Users</a>
  3. 这就是我设置区域的方式。

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

    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?}"
        );
    }
    

    使用[Area]注释设置管理员控制器,这样您就不必在管理区域下的所有其他控制器中指定。

    // 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>
    

答案 1 :(得分:0)

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

    template: "{controller=Home}/{action=Index}/{id?}");
相关问题