ASP.NET Core MVC控制器URL映射:为何Controller后缀可省略?
ASP.NET Core MVC控制器URL映射机制解析
核心疑问解答
为什么
DefaultTomatoController能通过/DefaultTomato访问?
这是ASP.NET Core MVC的默认命名约定:路由系统会自动忽略控制器类名末尾的Controller后缀,用剩余部分作为路由中的控制器段名称。所以DefaultTomatoController对应的路由段就是DefaultTomato,直接通过该路径即可访问。为什么无
Controller后缀的DefaultTomato2也能通过/DefaultTomato2访问?
路由系统做了兼容处理:如果控制器类名本身没有Controller后缀,就直接使用原类名作为路由段名称。不过官方推荐控制器类名加上Controller后缀,保证项目代码风格的一致性。
底层实现逻辑
ASP.NET Core MVC在启动时会通过ControllerFeatureProvider扫描程序集中的控制器类,识别符合条件的类型(比如继承自ControllerBase/Controller,或带有[Controller]特性)。
在构建路由元数据的过程中,框架会处理控制器名称:
- 检查控制器类名是否以
Controller结尾; - 如果是,自动裁剪掉末尾的
Controller字符串,用剩余部分生成路由映射; - 如果不是,则直接使用原类名作为路由段的匹配值。
这种设计是为了遵循"约定大于配置"的原则,减少开发者的路由配置工作量,同时保留一定的灵活性。
内容的提问来源于stack exchange,提问作者Rob K.
相关产品推荐
相关产品推荐

