ASP.NET中Url.Action传递字符串参数异常,如何正确传参?
解决Url.Action传递字符串参数出现Length=8的问题
嗨,这个坑我之前踩过!你遇到的Length=8问题,核心原因是**Url.Action的第三个参数预期接收的是路由值对象,而不是字符串**。当你直接传strQuerystring这个字符串时,.NET会把它当作一个普通对象,通过反射读取它的公共属性——字符串的Length属性值正好是8(你的字符串"Pacode=2"长度就是8),所以才生成了奇怪的?Length=8。
下面给你几种靠谱的解决办法:
方法1:用匿名对象传递路由参数(最推荐)
直接把查询参数拆成键值对,用匿名对象传递,这是Url.Action设计的标准用法:
@{ string strController = "Controller"; string strAction = "Action"; // 这里直接用键值对定义参数,不用拼接成字符串 var routeParams = new { Pacode = 2 }; } <a href="@Url.Action(strAction, strController, routeParams)" title="test"> <span>@Test</span> </a>
这样生成的链接就是你预期的Controller/Action?Pacode=2,清晰又不容易出错。
方法2:如果必须用字符串形式的QueryString(动态场景)
如果你的strQuerystring是从其他地方动态获取的完整查询字符串(比如不是你自己拼接的),可以用查询字符串拼接工具来处理:
ASP.NET Core 版本
先确保引用了命名空间@using Microsoft.AspNetCore.WebUtilities;,然后:
@{ string strController = "Controller"; string strAction = "Action"; string strQuerystring = "Pacode=2"; // 先获取基础路由地址,再拼接查询字符串 var baseUrl = Url.Action(strAction, strController); var fullUrl = QueryHelpers.AddQueryString(baseUrl, strQuerystring); } <a href="@fullUrl" title="test"> <span>@Test</span> </a>
ASP.NET MVC(非Core)版本
可以自己拆分字符串的键值对,放到RouteValueDictionary里:
@{ string strController = "Controller"; string strAction = "Action"; string strQuerystring = "Pacode=2"; var routeDict = new RouteValueDictionary(); // 拆分querystring的键值对 foreach (var pair in strQuerystring.Split('&')) { var keyValue = pair.Split('='); if (keyValue.Length == 2) { routeDict.Add(keyValue[0], keyValue[1]); } } } <a href="@Url.Action(strAction, strController, routeDict)" title="test"> <span>@Test</span> </a>
方法3:直接拼接完整URL(不推荐,但应急可用)
如果上面的方法都不想用,也可以直接手动拼接URL,但要注意编码问题:
<a href="@($"/{strController}/{strAction}?{strQuerystring}")" title="test"> <span>@Test</span> </a>
⚠️ 注意:这种方式没有自动处理URL编码,当参数值包含特殊字符时容易出问题,所以尽量不用。
内容的提问来源于stack exchange,提问作者Abdul Rehman Sayed
相关产品推荐
相关产品推荐

