如何将数组从C#传递给Javascript函数?
我使用WPF中的WebBrowser对象,我在浏览器中加载的页面中调用了一些Javascript代码,如下所示:
myWebBrowser.InvokeScript("myJsFunc", new object[] { foo.Text, bar.ToArray()});
现在,js函数应该迭代第二个参数(一个字符串数组)的元素并相应地做东西。 唯一的问题是该参数似乎不会作为js数组传递。
例如,
alert(typeof theArray);
提醒“未知”。
从CSharp调用js函数时,将数组作为参数传递的正确方法是什么?
也许将它作为json字符串传递并在js函数中解析它
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); var json = serializer.Serialize(bar.ToArray()); myWebBrowser.InvokeScript("myJsFunc", new object[] { foo.Text, json });
JS:
function myJsFunc(json) { var data = JSON.parse(json); // do something with it. }
它不是解决问题本身,但它解决了问题,如果你只有一个数组要通过:你可以向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 arguments = new List (); 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,这在世界上有所不同。 这是因为与强制使用基于字符串的参数强制javascript方法的.InvokeScript相反(这迫使你在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
另一件事是检索返回的结果值:
string result = (string)webBrowserControl.Document.InvokeScript("eval", new object[] { @"returnValue;" }));
为方便起见,您可能希望编写一个实用程序方法,该方法迭代给定的参数并正确地序列化它们,调用该函数然后检索返回的值。
您需要先将数组转换为JS数组,如下所示:
["John", "Bob", "Sue"] // literal array
以下是两个例子:
StringBuilder sb = new StringBuilder(); string[] stringArray = bar.ToArray(); //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(); // or simpler to use string join. string jsArray = "[" + String.Join( ",", stringArray ) + "]"; // myWebBrowser.InvokeScript("myJsFunc", new object[] { foo.Text, jsArray });