C# asp.net mvc 5管理路由

C# asp.net mvc 5管理路由,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,控制器目录中有HomeController.cs和AccountController.cs。我在控制器目录中添加了名为“Admin”的新文件夹,并在其中添加了DashboardController.cs 我想将/admin/dashboard路由到DashboardController,不幸的是/admin/Home和/admin/Account也将路由到各自的控制器。我希望/admin/Home和/admin/Account是404。我该怎么做 这是我的路线图 routes.MapRoute(

控制器目录中有HomeController.cs和AccountController.cs。我在控制器目录中添加了名为“Admin”的新文件夹,并在其中添加了DashboardController.cs

我想将/admin/dashboard路由到DashboardController,不幸的是/admin/Home和/admin/Account也将路由到各自的控制器。我希望/admin/Home和/admin/Account是404。我该怎么做

这是我的路线图

routes.MapRoute(
            name: "Admin",
            url: "admin/{controller}/{action}/{id}",
            defaults: new { controller = "Dashboard", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

在您的管理路径中,您需要将
{controller}
替换为
仪表板
,如下所示,这样它就不会将URL中
/Admin/
部分之后的下一个内容视为控制器:

routes.MapRoute(
        name: "Admin",
        url: "admin/dashboard/{action}/{id}",
        defaults: new { controller = "Dashboard", action = "Index", id = UrlParameter.Optional }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

MVC路由不基于文件夹结构进行映射。
在url(“admin/{controller}/{action}/{id}”)中,第一个/前面的子字符串表示控制器的名称。在这种情况下,您指定请求将调用“AdminController”,而不是“DashboardController”。@Wellspring给出的解决方案在这里是正确的。

正如@Hackerman在评论中所建议的那样。正确的方法是引入一个管理区域。这将自动为yoursite.com/admin页面创建路由

要添加管理区域,请右键单击web项目,选择添加>区域

然后,您希望将仪表板控制器和视图放置在该区域的相应文件夹中

除了添加区域外,您还希望使RouteConfig.cs中的默认路由不会拉起管理区域上的控制器。为此,您需要在route.config.cs中编辑默认路由。您希望在调用MapPath时添加名称空间属性,并将UseNamespaceFallback数据标记设置为false:

Route defaultRoute = routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new[] { typeof(HomeController).Namespace }
);
// this makes it so the route only looks for controllers under
// the namespace specified through the namespaces parameter
defaultRoute.DataTokens["UseNamespaceFallback"] = false;

我认为正确的方法是使用
区域