Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NETMVC核心2-区域路由_C#_Asp.net Mvc_Asp.net Core 2.0 - Fatal编程技术网

C# ASP.NETMVC核心2-区域路由

C# ASP.NETMVC核心2-区域路由,c#,asp.net-mvc,asp.net-core-2.0,C#,Asp.net Mvc,Asp.net Core 2.0,我正在尝试在ASP.NETMVCCore2应用程序中为管理员实现一个区域 我已将该区域的路线配置如下: // Default route app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); // Admin area route app.UseMvc(routes =&

我正在尝试在ASP.NETMVCCore2应用程序中为管理员实现一个
区域

我已将该区域的路线配置如下:

// 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?}");
});
http://localhost/Admin/Account/Index
http://localhost/Admin/Shopping/Basket
http://localhost/Admin/Admin/Users
这一切都很有效

此管理员
区域
使用与主网站相同的
布局
,尽管
\u ViewStart.cshtml
位于
区域/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>

有没有什么好方法可以使所有这些链接都与站点根目录相关?

您可以编辑模板,将URL显示为首选。i、 e.改为

    template: "{controller=Home}/{action=Index}/{id?}");

您可以编辑要显示为首选URL的模板。i、 e.改为

    template: "{controller=Home}/{action=Index}/{id?}");

如何在应用程序中设置有几个问题

  • 您不能使用
    app.UseMvc()
    两次。我想基本上最后一个会覆盖你的第一个设置。这就是为什么所有链接都有
    /admin
    区域前缀
  • 当您想在
    管理
    区域下生成指向用户管理的链接时,您应该使用
    asp区域
    ,如
    管理用户
  • 这是我将如何设置区域

    设置区域路由以及启动时的默认路由 设置带有[Area]注释的管理基本控制器,这样您就不必在管理区域下的所有其他控制器中指定该注释。 管理区域下的控制器 指定具有定位标记辅助对象的区域
    //我的习惯是始终使用锚定标记帮助器指定区域。
    //对于公共链接(不在任何区域下):
    //我只是传递空字符串,如asp area=“”
    //对于指向任何区域下任何控制器的链接:
    //只需通过该区域,如asp area=“admin”
    // http://localhost/account
    我的帐户
    // http://localhost/shopping/basket
    购物筐
    // http://localhost/admin/user
    管理用户
    // http://localhost/admin/dashboard
    管理面板
    
    如何在应用程序中设置有几个问题

  • 您不能使用
    app.UseMvc()
    两次。我想基本上最后一个会覆盖你的第一个设置。这就是为什么所有链接都有
    /admin
    区域前缀
  • 当您想在
    管理
    区域下生成指向用户管理的链接时,您应该使用
    asp区域
    ,如
    管理用户
  • 这是我将如何设置区域

    设置区域路由以及启动时的默认路由 设置带有[Area]注释的管理基本控制器,这样您就不必在管理区域下的所有其他控制器中指定该注释。 管理区域下的控制器 指定具有定位标记辅助对象的区域
    //我的习惯是始终使用锚定标记帮助器指定区域。
    //对于公共链接(不在任何区域下):
    //我只是传递空字符串,如asp area=“”
    //对于指向任何区域下任何控制器的链接:
    //只需通过该区域,如asp area=“admin”
    // http://localhost/account
    我的帐户
    // http://localhost/shopping/basket
    购物筐
    // http://localhost/admin/user
    管理用户
    // http://localhost/admin/dashboard
    管理面板
    
    我已更新我的问题,将默认路线包括在内。这已经在
    Configure
    method中设置好了。您不是要为管理部分更改路线吗?我是否需要在管理区域中将您的模板建议添加为路线配置?我已更新了我的问题,以包括默认路线。这已经在
    配置
    方法中设置好了。您是否要更改路线?我是否需要在管理区域内添加您的模板建议作为路线配置?谢谢-您的评论非常有用。你是正确的,我不能多次使用app.useMvc
    ,但是以下方法确实有效:
    app.useMvc(routes=>{routes.MapRoute(name:“default”,template:{controller=Home}/{action=Index}/{id?}”);routes.MapRoute(name:“admin”,template:{area=admin}/{controller=Home}/{action=Index}/{id?}“;})
    保持紧密联系。我正在向您展示如何正确操作!同样,设置路由的顺序很重要!您可以阅读我在上面的编码示例中的注释。您的答案非常完美,完全符合预期。我一直在实现它,因为您一直在更新帖子,但它非常有效。非常感谢您感谢!谢谢你-你的评论非常有用。你是正确的,我不能多次使用
    app.useMvc
    ,但以下方法确实有效:
    app.useMvc(routes=>{routes.MapRoute(name:“default”,模板:{controller=Home}/{action=Index}/{id?});routes.MapRoute(名称:“admin”,模板:{area=admin}/{controller=Home}/{action=Index}/{id?}”);})
    保持紧密联系。我正在向您展示如何正确操作!同样,设置路由的顺序很重要!您可以阅读我在上面的编码示例中的注释。您的答案非常完美,完全符合预期。我一直在实现它,因为您一直在更新帖子,但它非常有效。非常感谢您谢谢!
    // 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>