ASP.NET Core同名控制器下如何让a标签助手路由到MVC而非API控制器
问题原因
你的API控制器父类定义了[Route("api/[controller]/[action]")]特性路由,特性路由的优先级高于传统的控制器路由,因此锚标签助手匹配同名控制器时,会优先命中API控制器,生成带api前缀的链接。
可行解决方案
方案1:给默认路由配置命名空间优先级(全局生效,推荐)
修改传统路由的配置,通过dataTokens指定MVC控制器所在的命名空间,路由系统会优先匹配该命名空间下的控制器,无需修改视图代码:
endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}", // 替换为你实际的MVC控制器所在命名空间 dataTokens: new { Namespaces = new[] { "YourApp.Controllers.Mvc" } } );
方案2:在标签助手中显式指定使用传统默认路由(单标签生效,灵活可控)
给a标签添加asp-route="default"属性,强制使用名称为default的传统路由生成链接,不会匹配API的特性路由:
<a asp-route="default" asp-controller="persons" asp-action="Index">People directory</a>
方案3:调整特性路由优先级
给MVC控制器添加路由特性,并设置更低的Order值(值越小优先级越高),让MVC控制器的路由优先级高于API控制器:
// 给所有MVC控制器的父类加该特性即可,无需每个控制器重复加 [Route("[controller]/[action]", Order = -1)] public class BaseMvcController : Controller { // ... }
内容的提问来源于stack exchange,提问作者Bellash
相关产品推荐
相关产品推荐

