You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC如何配置含控制器名片段的URL路由映射规则

ASP.NET MVC 自定义Admin前缀路由配置方案

要实现admin/{PartOfControllerName}/{action}路径自动映射到Admin{PartOfControllerName}Controller的路由规则,核心逻辑是在路由匹配阶段自动给URL中的控制器名片段拼接Admin前缀,再交给MVC默认的控制器工厂解析即可。注意所有自定义路由必须注册在项目默认通用路由之前,路由匹配是按注册顺序优先级生效的。

方法一:轻量自定义路由处理(无侵入,适合大多数场景)

  1. 打开项目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();
  1. 在项目中添加简单的自定义路由处理类,核心作用是把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]特性:

  1. 注册特性路由时传入自定义约定:
// 替换原来的routes.MapMvcAttributeRoutes()调用
routes.MapMvcAttributeRoutes(new AdminControllerRouteConvention());
  1. 实现约定类:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:54:15