簡體   English   中英

如何將數組從 C# 傳遞給 Javascript function?

[英]How should an array be passed to a Javascript function from C#?

我使用來自 WPF 的 WebBrowser object 並且我在瀏覽器中加載的頁面中調用一些 Javascript 代碼,如下所示:

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

現在,js function 應該遍歷第二個參數(字符串數組)的元素並相應地做一些事情。 唯一的問題是參數似乎沒有作為 js 數組傳遞。

例如,

alert(typeof theArray);

警報“未知”。

從 CSharp 調用 js function 時,將數組作為參數傳遞的正確方法是什么?

也許將其作為 json 字符串傳遞,然后在 js function 中解析它

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 function,並通過arguments變量訪問它們。 它類似於 function 接受可變數量的 arguments,具有相同的優點和問題(例如,您必須最后傳遞數組,如前所述,您只能傳遞一個)。

這是一個示例 JavaScript function:

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,它使世界變得與眾不同。 This is because contrary to.InvokeScript which would forcefeed the javascript method with string based arguments (which is what forces you to use eval on the javascript side), .execScript() gives us the ability to write arbitrary javascript code including what you see above (注意 arguments 是一個顯式的 javascript 數組和一組屬性)。 現在我們可以直接編碼 arrays 和對象,並將它們寫為 arguments。 為此,我們只需使用 Newtonsoft.Json 序列化 arrays 和對象:

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;" }));

為方便起見,您可能需要編寫一個實用方法來迭代給定參數並正確序列化它們,調用 function 然后檢索返回值。

您需要先將數組轉換為 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 });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM