ASP.NET MVC如何配置含控制器名片段的URL路由映射规则
ASP.NET MVC 自定义Admin前缀路由配置方案
要实现admin/{PartOfControllerName}/{action}路径自动映射到Admin{PartOfControllerName}Controller的路由规则,核心逻辑是在路由匹配阶段自动给URL中的控制器名片段拼接Admin前缀,再交给MVC默认的控制器工厂解析即可。注意所有自定义路由必须注册在项目默认通用路由之前,路由匹配是按注册顺序优先级生效的。
方法一:轻量自定义路由处理(无侵入,适合大多数场景)
- 打开项目
App_Start/RouteConfig.cs文件,在默认路由注册代码前添加如下Admin路由配置:
// 注册Admin专属路由 routes.MapRoute( name: "AdminPanelRoute", url: "admin/{PartOfControllerName}/{action}/{id}", defaults: new { action = "Index", id = UrlParameter.Optional } ).RouteHandler = new AdminPrefixedRouteHandler();
- 在项目中添加简单的自定义路由处理类,核心作用是把URL提取到的控制器片段拼接前缀后,赋值给MVC识别的标准
controller路由参数:
using System.Web.Mvc; using System.Web.Routing; public class AdminPrefixedRouteHandler : MvcRouteHandler { protected override IHttpHandler GetHttpHandler(RequestContext requestContext) { var routeData = requestContext.RouteData; // 提取URL中的控制器名片段 var controllerPart = routeData.GetRequiredString("PartOfControllerName"); // 拼接Admin前缀,写入标准controller路由参数 routeData.Values["controller"] = $"Admin{controllerPart}"; return base.GetHttpHandler(requestContext); } }
配置完成后映射逻辑自动生效:
- 请求路径
/admin/post/new:提取PartOfControllerName=post,拼接后控制器名为AdminPost,MVC会定位到AdminPostController的New动作执行 - 请求路径
/admin/user/edit/1:自动映射到AdminUserController的Edit动作,传入id参数值为1 - 请求路径
/admin/setting:默认匹配Index动作,映射到AdminSettingController.Index()
方法二:特性路由约定(适合项目已启用特性路由的场景)
如果你的项目已经开启了MVC特性路由,可以通过自定义控制器约定,自动给所有Admin前缀的控制器应用对应路由规则,不需要每个控制器单独写[RoutePrefix]特性:
- 注册特性路由时传入自定义约定:
// 替换原来的routes.MapMvcAttributeRoutes()调用 routes.MapMvcAttributeRoutes(new AdminControllerRouteConvention());
- 实现约定类:
using System.Web.Mvc.Routing; using System.Linq; public class AdminControllerRouteConvention : IControllerConfigurationConvention { public void Apply(ControllerModel controller, ControllerDescriptor controllerDescriptor) { // MVC默认的ControllerName已经去掉了类名末尾的Controller后缀 var controllerShortName = controller.ControllerName; if (controllerShortName.StartsWith("Admin", System.StringComparison.OrdinalIgnoreCase)) { // 提取Admin之后的控制器名片段 var namePart = controllerShortName.Substring(5); // 自动应用路由前缀 controller.RoutePrefix = new RoutePrefixAttribute($"admin/{namePart.ToLowerInvariant()}"); // 给所有未单独指定路由的动作默认匹配{action}段 foreach (var action in controller.Actions.Where(a => !a.RouteIsSpecified)) { action.RouteTemplate = "{action}/{id?}"; } } } }
注意事项
- 控制器类必须定义为
public,命名严格遵循Admin{PartOfControllerName}Controller格式,否则MVC控制器工厂无法识别 - 路由注册顺序不能颠倒,自定义Admin路由必须放在默认的
Default路由代码之前 - 该配置不影响你给Admin控制器加身份验证、权限过滤等特性,原有过滤器逻辑完全兼容
内容的提问来源于stack exchange,提问作者Ali Mottaghi Pour
相关产品推荐
相关产品推荐

