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

如何全局配置ASP.NET Core 6+ API控制器路由为短横线命名?

ASP.NET Core 6 全局配置控制器路由为Kebab-Case格式

要实现将PascalCase格式的控制器名称自动转换为kebab-case路由(如PackageGroupsController对应/package-groups),无需逐个控制器硬编码路由,可以通过自定义路由约定全局配置,步骤如下:

1. 创建自定义路由约定类

实现IControllerModelConvention接口,在Apply方法中处理控制器名称的格式转换,并替换默认路由模板:

using Microsoft.AspNetCore.Mvc.ApplicationModels;
using System.Text.RegularExpressions;

public class KebabCaseControllerRouteConvention : IControllerModelConvention
{
    public void Apply(ControllerModel controller)
    {
        // 移除控制器默认的路由模板
        var defaultRoute = controller.Selectors.FirstOrDefault(s => s.AttributeRouteModel != null)?.AttributeRouteModel;
        if (defaultRoute != null)
        {
            controller.Selectors.RemoveAll(s => s.AttributeRouteModel == defaultRoute);
        }

        // 处理控制器名称:移除Controller后缀,将PascalCase转为kebab-case
        var rawControllerName = controller.ControllerName.Replace("Controller", string.Empty);
        var kebabCaseName = Regex.Replace(rawControllerName, "(?<!^)([A-Z])", "-$1").ToLower();

        // 构建新的路由模板(可根据需求调整是否保留api前缀)
        var newRouteTemplate = new AttributeRouteModel
        {
            Template = kebabCaseName
            // 如果需要统一加api前缀,改为Template = $"api/{kebabCaseName}"
        };

        // 为控制器的所有选择器应用新路由模板
        foreach (var selector in controller.Selectors)
        {
            selector.AttributeRouteModel = selector.AttributeRouteModel != null 
                ? AttributeRouteModel.CombineAttributeRouteModel(newRouteTemplate, selector.AttributeRouteModel) 
                : newRouteTemplate;
        }
    }
}

2. 在Program.cs中注册约定

在添加控制器服务时,将自定义约定注入到配置中:

var builder = WebApplication.CreateBuilder(args);

// 注册控制器服务并添加自定义路由约定
builder.Services.AddControllers(options =>
{
    options.Conventions.Add(new KebabCaseControllerRouteConvention());
});

var app = builder.Build();

// 中间件配置(按项目需求保留原有逻辑)
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();

app.Run();

补充说明

  • 全局约定会自动作用于所有控制器,无需逐个修改;如果个别控制器需要自定义路由,直接在控制器上标注[Route]属性即可,自定义路由会覆盖全局约定。
  • 正则表达式(?<!^)([A-Z])用于匹配除首字符外的大写字母,替换为-+对应字母后转小写,完美实现PascalCase到kebab-case的转换。

内容的提问来源于stack exchange,提问作者Geekmard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:12:24