如何在MVC Core中为控制器方法添加替代路由以兼容旧端点?
解决ASP.NET Core中添加多个路由到同一控制器动作的问题
要让新旧两个端点都能访问CompanyStatusSummary动作,你只需要给这个方法添加多个路由属性即可——你之前的代码只指定了旧路由的[HttpGet],覆盖了默认的动作名称路由,所以才只能通过旧路径访问。
下面是几种可行的实现方式:
方式1:添加多个[HttpGet]属性(推荐)
直接给动作同时标注新、旧两个路由的[HttpGet]属性,两个路由都会映射到同一个方法:
[HttpGet("[Area]/[Controller]/CompanyStatusSummary")] // 新路由 [HttpGet("[Area]/[Controller]/DailyStatusSummary")] // 旧路由(作为替代) public async Task<IActionResult> CompanyStatusSummary() { // 你的业务逻辑代码 }
方式2:结合控制器级路由简化写法
如果你的控制器已经标注了[Route("[Area]/[Controller]")]这类路由前缀,那么动作上的路由可以简化为相对路径:
// 控制器顶部的路由前缀 [Route("[Area]/[Controller]")] public class YourController : Controller { [HttpGet("CompanyStatusSummary")] // 新路由:[Area]/[Controller]/CompanyStatusSummary [HttpGet("DailyStatusSummary")] // 旧路由:[Area]/[Controller]/DailyStatusSummary public async Task<IActionResult> CompanyStatusSummary() { // ... } }
方式3:使用[Route]属性
你也可以用通用的[Route]属性配合HTTP方法约束,效果和[HttpGet]一致:
[Route("[Area]/[Controller]/CompanyStatusSummary", Name = "NewCompanyStatusRoute")] [Route("[Area]/[Controller]/DailyStatusSummary", Name = "OldDailyStatusRoute")] [HttpGet] public async Task<IActionResult> CompanyStatusSummary() { // ... }
为什么你之前的代码不生效?
当你只给动作添加单个带路由模板的[HttpGet]时,ASP.NET Core会忽略默认的动作名称路由约定,只启用你指定的那个路由。添加多个路由属性后,框架会把所有指定的路由都映射到这个动作,这样新旧端点就都能正常访问了。
内容的提问来源于stack exchange,提问作者egmfrs
相关产品推荐
相关产品推荐

