2016-11-09 211 views
1

我在Controller目录中有HomeController.cs和AccountController.cs。我在Controller目录中添加了名为“Admin”的新文件夹,并在其中添加了DashboardController.csasp.net mvc 5管理员路由

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

这里是我的RouteConfig.cs

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 } 
     ); 
+0

我认为这样做的正确方法是,使用'areas' HTTP://www.infragistics。 COM /社区/博客/ dhananjay_kumar /存档/ 2015/11/25 /地区,在-ASP净mvc.aspx – Hackerman

回答

1

在管理员的路线,你需要dashboard更换{controller}如下图所示,这样,它不会把你的网址/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 } 
    ); 
0

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

0

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

要添加管理区域,请右键单击您的Web项目,选择添加>区域。

然后,您希望将Dashboard控制器和视图置于该区域的相应文件夹中。

除了添加该区域之外,还需要使其在RouteConfig.cs中的默认路由不会拉出Admin区域中的控制器。为此,您需要编辑Route.config.cs中的Default路由。要添加在调用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;