如何在控制器 ASP.NET MVC 5 上禁用默认路由

本文关键字:默认 路由 MVC 控制器 ASP NET | 更新日期: 2023-09-27 18:30:21

我正在构建一个带有自定义管理部分的 Web 应用程序(ASP.NET MVC 5),其中包含应用程序的所有参数。

我希望能够轻松更改此部分的名称。

例如

myapp.com/admin/{controller}/{action}

可能是

myapp.com/custom-admin-name/{controller}/{action}

我尝试使用区域,但似乎很难编辑它们的名称,因为所有controllersmodels都绑定到该区域的namespace

我还尝试设置自定义路线

routes.MapRoute(
    "AdminControllerAction",
    "custom-admin-name/{controller}/{action}",
    new { controller = "Dashboard", action = "Index" }
);

所以我可以做

mywebsite.com/custom-admin-name/dashboard/index

但问题是我的管理控制器和操作仍然可以使用

mywebsite.com/dashboard/index

是否可以取消控制器/操作的默认路由?

对于这个问题,还有我不会想到的更可行的解决方案吗?

如何在控制器 ASP.NET MVC 5 上禁用默认路由

有一种方法可以限制给定路由的控制器命名空间,因此不属于这些命名空间的控制器将被忽略。

例如,以下内容将仅限于命名空间YourApp.Controllers中的控制器(如果需要,可以添加多个命名空间):

Route route = routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new[] { "YourApp.Controllers" }                
);
route.DataTokens["UseNamespaceFallback"] = false;

禁用命名空间回退很重要,否则只会确定这些命名空间的优先级。

因此,您可以如上所述将默认路由限制为命名空间YourApp.Controllers,并创建一个仅限于命名空间YourApp.Controllers.Admin的自定义管理路由:

Route route = routes.MapRoute(
    "AdminControllerAction",
    "custom-admin-name/{controller}/{action}",
    new { controller = "Dashboard", action = "Index" },
    namespaces: new[] { "YourApp.Controllers.Admin" }                
);
route.DataTokens["UseNamespaceFallback"] = false;

请注意,正如 Tareck 所提到的,管理路由必须在常规路由之前定义。

尝试用这个删除

RouteTable.Routes.Remove(RouteTable.Routes["NAME ROUTE YOU WISH TO RMOVE"]);