You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:36:02