Url.Action 未输出自定义映射控制器路由

Posted

技术标签:

【中文标题】Url.Action 未输出自定义映射控制器路由【英文标题】:Url.Action not outputting custom mapped controller route 【发布时间】:2021-12-07 14:05:00 【问题描述】:

这适用于 .NET 5.0 MVC Web 应用程序。

我有一个控制器来管理我网站的管理区域中的代理类型:

[Area("Admin")]
public class AgencyTypesController : Controller
        
    public async Task<IActionResult> Index()
    
        ...
    
    
    public async Task<IActionResult> Create()
    
        ...
    
    
    public async Task<IActionResult> Edit(Guid id)
    
        ...
            

当前 url 是 /Admin/AgencyTypes,但我希望它是 /Admin/Agencies/Types,所以我在 Startup 中有这个:

app.UseEndpoints(endpoints =>

    endpoints.MapControllerRoute(
        name: "areas",
        pattern: "area:exists/controller=Home/action=Index/id?"
    );
);

app.UseEndpoints(endpoints =>

    endpoints.MapControllerRoute(
        name: "agencytypes",
        pattern: "area:exists/Agencies/Types/action=Index",
        defaults: new  controller = "AgencyTypes", action = "Index" 
    );
);

app.UseEndpoints(endpoints =>

    endpoints.MapControllerRoute(
        name: "default",
        pattern: "controller=Home/action=Index/id?");
);

当我导航到/Admin/Agencies/Types 时,我的路由似乎工作正常,它在 AgencyTypesController 中点击了 Index 操作。

问题是我的页面有指向 Create 和 Edit 方法的链接,使用 Url.Action

@Url.Action("Create", "AgencyTypes", new  Area = "Admin" )
@Url.Action("Edit", "AgencyTypes", new  Area = "Admin", id = ID )

而不是将这些网址呈现为/Admin/Agencies/Types/Create/Admin/Agencies/Types/Edit/id,它仍在使用/Admin/AgencyTypes/Create/Admin/AgencyTypes/Edit 的网址

要让Url.Action 使用我的自定义路线,我还需要做些什么吗?还是我绘制路线的方式有问题?

【问题讨论】:

有Url.RouteUrl。 您应该在一般 MapControllerRoute 之前添加更具体的 MapControllerRoute @AliZeinali 你是什么意思,就像我每个动作都需要一个? 【参考方案1】:

先添加更具体的路线:

app.UseEndpoints(endpoints =>

    endpoints.MapControllerRoute(
        name: "agencytypes",
        pattern: "area:exists/Agencies/Types/action=Index",
        defaults: new  controller = "AgencyTypes", action = "Index" 
    );
);

app.UseEndpoints(endpoints =>

    endpoints.MapControllerRoute(
        name: "areas",
        pattern: "area:exists/controller=Home/action=Index/id?"
    );
);

app.UseEndpoints(endpoints =>

    endpoints.MapControllerRoute(
        name: "default",
        pattern: "controller=Home/action=Index/id?");
);

这是因为当它要创建一个 url 时,它会通过您定义的路线并找到第一个匹配的路线。

因此,当您首先添加像 area:exists/controller=Home/action=Index/id? 这样的一般模式时,它将位于列表的第一个,因此它始终是第一个匹配的模式

【讨论】:

以上是关于Url.Action 未输出自定义映射控制器路由的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC Url.Action 和路由名称值

laravel-路由配置中@的作用

更改Url.Action(操作,控制器)默认功能

在 ASP.NET Core MVC 中将自定义查询参数添加到操作 URL

要映射到 rails 4 中的自定义路径的资源路由

beego 各种形式的路由实例