.NET 5 MVC中Url.Action未生成自定义映射控制器路由链接如何解决
问题原因
- 路由匹配优先级错误:ASP.NET Core路由系统按照注册顺序从上到下匹配规则,你将通用Area路由放在自定义路由之前,
Url.Action生成链接时会优先命中通用Area规则,返回默认格式路径。 - 路由配置拆分不合理:多次调用
UseEndpoints会导致路由注册顺序不符合预期,所有路由规则应放在同一个UseEndpoints配置块内。 - 自定义路由缺少id参数:原有自定义路由未配置可选id参数,无法匹配Edit等需要传id的动作。
解决方法
方案一:调整全局路由配置
修改Startup.cs中的路由注册顺序,将自定义路由放在最前面,同时补充id参数适配所有动作:
app.UseEndpoints(endpoints => { // 自定义AgencyTypes路由优先级最高 endpoints.MapControllerRoute( name: "agencytypes", pattern: "{area:exists}/Agencies/Types/{action=Index}/{id?}", defaults: new { controller = "AgencyTypes" } ); // 通用Area路由放在自定义路由之后 endpoints.MapControllerRoute( name: "areas", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}" ); // 全局默认路由放最后 endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
方案二:使用属性路由(更稳妥)
直接在AgencyTypesController上添加路由属性,无需调整全局路由顺序,避免影响其他控制器的路由规则:
[Area("Admin")] [Route("Admin/Agencies/Types/[action]")] public class AgencyTypesController : Controller { public async Task<IActionResult> Index() { ... } public async Task<IActionResult> Create() { ... } public async Task<IActionResult> Edit(Guid id) { ... } }
修改完成后,Url.Action生成的链接就会自动适配/Admin/Agencies/Types/[动作名]的格式,带id参数的Edit动作也会生成符合要求的路径。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

