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

.NET 7中如何修改继承BaseApiController的控制器路由名称?

解决方案

方法1:使用[ControllerName]特性(最简单直接)

在派生控制器上添加[ControllerName]特性,指定你想要的路由名称即可。基类的[Route("api/v1/[controller]")]会自动用这个指定值替换[controller]占位符,完美兼容原有的动作路由模板。

示例代码:

// 抽象基类
[Route("api/v1/[controller]")]
public abstract class BaseApiController<TController> : ControllerBase
{
}

// 派生的Auth控制器
[ControllerName("auth")]
public class AuthApiController : BaseApiController<AuthApiController>
{
    [HttpPost("new")]
    public IActionResult CreateNewUser()
    {
        // 业务逻辑代码
        return Ok();
    }
}

此时CreateNewUser方法的路由会自动变为/api/v1/auth/new。

方法2:在派生控制器上直接指定路由前缀

如果不想依赖[controller]占位符,也可以在派生控制器类上重新定义[Route]特性,直接写死自定义前缀,覆盖基类的类级路由规则:

[Route("api/v1/auth")]
public class AuthApiController : BaseApiController<AuthApiController>
{
    [HttpPost("new")]
    public IActionResult CreateNewUser()
    {
        return Ok();
    }
}

这种方式更灵活,适合需要完全自定义路由前缀的场景,动作方法的路由模板会自动和这个前缀拼接。

方法3:自定义控制器路由约定(批量处理)

如果项目中有大量XXXApiController格式的控制器,想要统一去掉Api后缀生成路由,可以自定义全局约定批量处理:

  1. 创建约定实现类:
public class TrimApiControllerSuffixConvention : IControllerModelConvention
{
    public void Apply(ControllerModel controller)
    {
        // 针对以"ApiController"结尾的控制器名称,去掉后缀
        if (controller.ControllerName.EndsWith("ApiController"))
        {
            controller.ControllerName = controller.ControllerName.Replace("ApiController", string.Empty);
        }
    }
}
  1. 在Program.cs中注册该约定:
builder.Services.AddControllersWithViews(options =>
{
    options.Conventions.Add(new TrimApiControllerSuffixConvention());
});

注册后,所有类似AuthApiController的控制器,其[controller]占位符都会自动替换为auth,基类的路由规则会直接生成api/v1/auth前缀,无需逐个控制器配置。


内容的提问来源于stack exchange,提问作者Matteo Pietro Peru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:02:40