Asp.net MVC 5管理路由

本文关键字:管理 路由 MVC net Asp | 更新日期: 2023-09-27 18:17:13

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

我想/admin/dashboard路由到DashboardController不幸的是/admin/Home和/admin/Account也将路由到各自的控制器。我希望/admin/Home和/admin/Account都是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 }
        );

Asp.net MVC 5管理路由

在Admin路由中,您需要将{controller}替换为dashboard,如下所示,这样它就不会将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在评论中建议的那样。正确的方法是引入Admin区域。这将自动为yoursite.com/admin页面创建路由。

要添加Admin区域,右键单击您的web项目,选择add> area。

然后你想把你的Dashboard控制器和视图放在该区域的相应文件夹中。

除了添加这个区域,你还想让你在RouteConfig.cs中的默认路由不会拉出Admin区域上的控制器。要做到这一点,你需要在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;