如何在Startup.cs中配置路由移除控制器名称的Step前缀?
解决方案:通过Startup.cs集中配置移除路由中的"Step"前缀
当然可以!不需要给每个控制器添加[Route]特性,你可以通过自定义控制器路由约定(Controller Model Convention)来实现这个需求,在Startup.cs中集中配置规则,自动移除控制器名称里的"Step"前缀。
步骤1:创建自定义路由约定类
首先,创建一个实现IControllerModelConvention的类,用来修改控制器的路由模板:
using Microsoft.AspNetCore.Mvc.ApplicationModels; using System; public class RemoveStepPrefixConvention : IControllerModelConvention { public void Apply(ControllerModel controller) { // 检查控制器名称是否以"Step"开头(不区分大小写) if (controller.ControllerName.StartsWith("Step", StringComparison.OrdinalIgnoreCase)) { // 移除"Step"前缀("Step"共4个字符) var modifiedControllerName = controller.ControllerName.Substring(4); // 清除默认路由选择器,替换为自定义路由模板 controller.Selectors.Clear(); controller.Selectors.Add(new SelectorModel { AttributeRouteModel = new AttributeRouteModel { // 自定义路由模板:修改后的控制器名称 + 动作(默认Index) Template = $"{modifiedControllerName}/{{action=Index}}" } }); } } }
步骤2:在Startup.cs中注册该约定
在ConfigureServices方法里,将自定义约定添加到MVC选项中:
public void ConfigureServices(IServiceCollection services) { services.AddControllers(options => { // 注册自定义路由约定 options.Conventions.Add(new RemoveStepPrefixConvention()); }); }
效果验证
这样配置后,你的控制器路由会自动转换:
Step1_PersonalDataController→ URL路径为/1_PersonalData(默认动作Index),其他动作如/1_PersonalData/Validate也会正常工作Step2_OptionsController→ URL路径为/2_Options- 以此类推,所有以"Step"开头的控制器都会自动移除前缀,非"Step"开头的控制器不受影响
注意事项
- 如果某些控制器需要特殊路由规则,你仍然可以给单个控制器或动作添加
[Route]特性,特性路由的优先级会高于这个全局约定 - 该方案适用于ASP.NET Core 2.x及以上版本(包括.NET 6+,如果是.NET 6+的极简API,只需将注册代码移到Program.cs的
builder.Services.AddControllers()配置中即可)
内容的提问来源于stack exchange,提问作者Dario
相关产品推荐
相关产品推荐

