如何在C# WebBrowser控件中向JavaScript函数传递JSON数组?代码调用失败
问题分析与解决步骤
你的代码无法正常运行的核心原因是参数结构不匹配,另外还有一些细节可以优化,下面一步步给你拆解:
1. 最关键的问题:参数结构不符合JS函数预期
你的JS函数第二个参数期望的是一个直接的数组(比如[{"name":"foo",...},...]),但你在C#里把数组包装在了一个带items属性的匿名对象里,导致JS拿到的是{items: [数组内容]},完全不是它要的格式。
修正后的C#代码
直接传递匿名类型数组即可,不需要外层的items包装:
Object[] jsParams = new Object[3]; jsParams[0] = "test"; // C#会自动装箱,不需要强制转Object jsParams[1] = new[] { new { name = "foo", value = "21980" }, new { name = "bar", value = "100" }, new { name = "foo", value = "27492328" }, new { name = "bar", value = "WEB21980001831" } }; jsParams[2] = "test"; this.webBrowserCtl.Document.InvokeScript("jsFunction", jsParams);
2. 备选方案:手动序列化JSON字符串(如果自动转换失效)
如果WebBrowser控件的CLR对象到JS对象自动转换出现问题(比如某些环境下匿名类型转换异常),可以手动把数组序列化为JSON字符串,再在JS里解析:
C#端代码(需要引用System.Web.Extensions)
using System.Web.Script.Serialization; // ... // 构建数组 var dataArray = new[] { new { name = "foo", value = "21980" }, new { name = "bar", value = "100" }, new { name = "foo", value = "27492328" }, new { name = "bar", value = "WEB21980001831" } }; // 序列化为JSON字符串 var serializer = new JavaScriptSerializer(); string jsonString = serializer.Serialize(dataArray); // 组装参数 Object[] jsParams = new Object[3]; jsParams[0] = "test"; jsParams[1] = jsonString; jsParams[2] = "test"; this.webBrowserCtl.Document.InvokeScript("jsFunction", jsParams);
对应JS函数修改
需要把传入的字符串解析为数组:
function jsFunction(str1, jsonStr, str2) { // 解析JSON字符串为数组 var jsonArray = JSON.parse(jsonStr); // 你的业务逻辑... }
3. 额外优化:修复JS函数的参数名冲突
你的JS函数定义了两个同名的string参数:function jsFunction(string, jsonArray, string),虽然JS语法允许,但后面的参数会覆盖前面的,容易引发逻辑错误,建议改成不同的命名,比如:
function jsFunction(str1, jsonArray, str2) { // 逻辑代码... }
内容的提问来源于stack exchange,提问作者h0ch5tr4355
相关产品推荐
相关产品推荐

