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

如何使用Url.Action获取带额外参数的当前多语言路由URL

解决多语言路由下生成对应当前路由的URL问题

这个问题的核心在于Url.Action会默认匹配路由表中第一个符合控制器和Action条件的路由,而不是当前请求实际匹配的那条路由。要生成对应当前页面的正确URL,你需要基于当前请求匹配的路由名称来构建链接,具体可以这样做:

方法1:在视图中直接获取当前路由名称并生成URL

在你的共享视图里,通过ViewContext获取当前请求匹配的路由名称,然后使用Url.RouteUrl指定该名称和分页参数:

@{
    // 获取当前请求匹配的路由名称
    var currentRouteName = ViewContext.RouteData.Route.GetRouteName();
}

<!-- 生成第二页的URL -->
<a href="@Url.RouteUrl(currentRouteName, new { page = 2 })">第二页</a>

这样当用户在example.com/produkte页面时,currentRouteName会是Products_de,生成的URL就是example.com/produkte?page=2;在example.com/products页面时则会生成example.com/products?page=2。

方法2:在控制器中传递当前路由名称到视图

如果你更倾向于在控制器层处理路由名称的传递,可以在Products Action中将当前路由名称存入ViewBag:

[Route("products", Name = "Products_en")]
[Route("produkte", Name = "Products_de")]
public ActionResult Products(int page = 1) 
{
    // 将当前匹配的路由名称传递给视图
    ViewBag.CurrentRouteName = RouteData.Route.GetRouteName();
    return View();
}

然后在视图中直接使用这个值生成URL:

<a href="@Url.RouteUrl(ViewBag.CurrentRouteName, new { page = 2 })">第二页</a>

为什么Url.Action不生效?

Url.Action(null, new { page = 2 })会遍历整个路由表,找到第一个匹配Products Action的路由(也就是你定义的Products_en),所以无论当前请求是哪个语言路径,都会生成/products?page=2的链接。而通过指定当前路由名称,我们强制使用请求实际匹配的那条路由来生成URL,就能得到符合预期的多语言分页链接了。

内容的提问来源于stack exchange,提问作者Okan Kocyigit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:13:50