如何将数组从c#传递给Javascript函数?

本文关键字:Javascript 函数 数组 | 更新日期: 2023-09-27 18:01:26

我使用WPF中的WebBrowser对象并在浏览器中加载页面中调用一些Javascript代码,如下所示:

myWebBrowser.InvokeScript("myJsFunc", new object[] { foo.Text, bar.ToArray<string>()});

现在,js函数应该遍历第二个参数(字符串数组)的元素并相应地做一些事情。唯一的问题是参数似乎不是作为js数组传递的。

例如,

alert(typeof theArray);
"未知"

警报。

从CSharp调用js函数时,传递数组作为参数的正确方法是什么?

如何将数组从c#传递给Javascript函数?

可以将其作为json字符串传递,然后在js函数中解析

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var json = serializer.Serialize(bar.ToArray<string>());
myWebBrowser.InvokeScript("myJsFunc", new object[] { foo.Text, json });

js:

function myJsFunc(json) {
   var data = JSON.parse(json);
   // do something with it.
}
http://blogs.microsoft.co.il/blogs/pini_dayan/archive/2009/03/12/convert-objects-to-json-in-c-using-javascriptserializer.aspx

这不是解决问题本身,但它解决了问题,如果你只有一个数组传递:你可以发送任意数量的参数到一个JavaScript函数,并通过arguments特殊变量访问它们。它变得类似于接受可变数量参数的函数,具有相同的优点和问题(例如,必须最后传递数组,正如前面提到的,您只能传递一个数组)。

下面是一个JavaScript函数示例:
function foo()
{
    var stringArgs = [];
    for (var i = 0; i < arguments.length; i++)
        stringArgs.push(arguments[i]);
    // do stuff with stringArgs
}

你可以在c#中像这样调用它:

List<string> arguments = new List<string>();
arguments.Add("foo");
arguments.Add("bar");
webBrowser.InvokeScript("foo", arguments.ToArray());

如果您真的想从代码中挤出每一点性能,您可以通过javascript中的eval来避免反序列化。其概念是这样构建调用:

((IHTMLWindow2)webBrowserControl.Document.Window.DomWindow).execScript("var returnValue = someFunction([ 'abc', 'xyz', '1', '2', '3' ], { foo: 'xyz', bar: 1 });"

请注意,我们使用了。execscript,这使得世界上所有的不同。这是因为与. invokescript相反,它会强制为javascript方法提供基于字符串的参数(这就是强迫你在javascript端使用eval的原因),. execscript()让我们能够编写任意javascript代码,包括你上面看到的(注意参数是一个显式javascript数组和一袋属性)。现在我们可以直接对数组和对象进行编码,并将它们写成参数。为了做到这一点,我们用Newtonsoft。Json序列化数组和对象:

class Test {
     public string foo;
     public int bar;
}
((IHTMLWindow2)webBrowserControl.Document.Window.DomWindow).execScript("var returnValue = someFunction(" +
JsonConvert.SerializeObject((new List<object>(2) { "abc", "xyz", 1, 2, 3 }).ToArray()) + ", " + JsonConvert.SerializeObject(new Test() { foo = "xyz", bar = 1 }) + ");");
另一件事是检索结果返回值:
string result = (string)webBrowserControl.Document.InvokeScript("eval", new object[] { @"returnValue;" }));

为方便起见,您可能需要编写一个实用程序方法,该方法遍历给定的参数并正确地序列化它们,调用函数,然后检索返回值。

您需要首先将数组转换为JS数组,看起来像这样:

["John", "Bob", "Sue"] // literal array

下面是两个例子:

StringBuilder sb = new StringBuilder();
string[] stringArray = bar.ToArray<string>();
//Build the JS array.
sb.Append( "[");
for (int i = 0; i < stringArray.Length; i++)
{
    sb.AppendFormat( "'{0}', ", stringArray[i] );
}
sb.Append( "]");

// Now send the array to the JS function.
myWebBrowser.InvokeScript("myJsFunc", new object[] { foo.Text, sb.ToString() });

您可能还想删除尾随符。不要忘记为StringBuilder导入适当的库,我认为是System.Text.StringBuilder;

或使用,例二:

string[] stringArray = bar.ToArray<string>();
// or simpler to use string join.
string jsArray = "[" + String.Join( ",", stringArray ) + "]";
//
myWebBrowser.InvokeScript("myJsFunc", new object[] { foo.Text, jsArray });