c# - ASP.Net MVC Core 2 - 区域路由

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

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

我已经为该区域配置了如下路由:

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

这一切都很好。

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

我遇到的问题是主站点布局文件中的导航菜单组件和所有 anchor 中的 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?}"
    );
}

使用 [Area] 注释设置一个管理基础 Controller ,这样您就不必在所有其他应该位于管理区域下的 Controller 中指定它。

// Assume you have an Admin area under /Areas/Admin

namespace DL.SO.Web.UI.Areas.Admin.Controllers
{
    [Area("admin")]
    public abstract class AdminControllerBase : Controller
    {
    }
}

管理区下的 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();
        }
    }
}

用 anchor 标签助手指定区域

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

关于c# - ASP.Net MVC Core 2 - 区域路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50375752/

相关文章:

c# - 创建动态 SQL DbParameter 值

c# - 将 RTF 特殊字符输出到 Unicode

asp.net - 使用Asp.net Core 2.1将Angular 5.2更新为Angular 6 Visual Studio Mac 7.5.2

c# - 在单独的 div 中的文本区域中间对齐标签

c# - AWS .NET SDK、AliasTarget 记录集问题

asp.net-mvc - 如何禁用 ASP.NET MVC Core 2 中的防伪 token 检查

c# - WEB.API 不会在 POST 方法中反序列化传入的 JSON

c# - 在来自asp.net的上传文件中以C#编辑mp3

asp.net-mvc - 将部分 View 渲染为字符串 MVC4

c# - 如何将键值对传递给 ASP.NET Core WebApi 中的 HttpGet?