如何将动态QueryString重新加入ASP.NET MVC的ActionLink中?
如何在ActionLink中保留动态QueryString参数?
我懂你现在的需求——生成多语言切换链接时,得把当前请求里的所有动态QueryString参数都带过去,不能只保留controller和action。其实这个问题很好解决,我们只需要把现有路由值和QueryString参数合并成一个完整的路由字典,再传递给ActionLink就可以了。
直接上修改后的代码,每一步我都加了注释方便你理解:
@{ // 先基于当前路由值创建一个可修改的路由字典 var routeValues = new RouteValueDictionary(this.ViewContext.RouteData.Values); // 遍历当前请求的所有QueryString参数,把它们逐一添加到路由字典中 foreach (string key in this.Request.QueryString.Keys) { if (!string.IsNullOrEmpty(key)) { routeValues[key] = this.Request.QueryString[key]; } } // 从字典中取出controller和action(保持你原有的写法逻辑) var controller = routeValues["controller"] as string; var action = routeValues["action"] as string; } <ul class="list-inline"> <li>@Resources.Global.Language : </li> <li> @{ // 复制一份路由字典,避免修改原字典影响另一个语言链接 var enRouteValues = new RouteValueDictionary(routeValues); // 设置英文对应的culture参数 enRouteValues["culture"] = "en"; } @Html.ActionLink("English", action, controller, enRouteValues, new { rel = "alternate", hreflang = "en" }) </li> <li> @{ // 同样复制字典,设置中文对应的culture参数 var zhRouteValues = new RouteValueDictionary(routeValues); zhRouteValues["culture"] = "zh"; } @Html.ActionLink("中文", action, controller, zhRouteValues, new { rel = "alternate", hreflang = "zh" }) </li> </ul>
方案说明
- 用
RouteValueDictionary包装现有路由值,方便后续添加、修改参数 - 遍历QueryString的所有键值对,不管有多少个动态参数,都会自动被整合到路由字典里
- 为每种语言单独复制路由字典,避免修改culture时互相干扰
- 最终传递给ActionLink的完整字典,会让生成的链接包含所有原QueryString参数+新的culture参数
这样不管你的QueryString是?id=123&filter=active还是其他任意动态组合,生成的语言切换链接都会完整保留这些参数,同时完成语言切换。
内容的提问来源于stack exchange,提问作者Pop
相关产品推荐
相关产品推荐

