2012-06-05 12 views
9

Utilizzo di WebBrowser su un modulo e chiamata in C# da Javascript con window.external. Passando in un array JavaScript di classi nella funzione:Accedere agli elementi di un array JavaScript da C# (tramite WebBrowser)?

var x = []; 
x.push(classa); 
x.push(classa); 

window.external.CSharpFunction(x); 

posso ottenere con successo x.length in C# con:

int length=(int)x.GetType().InvokeMember("length", BindingFlags.GetProperty, null, x, null); 

La mia domanda è come faccio ad ottenere x [0] e [x 1]? Ho provato

x.GetType().InvokeMember(string.Empty, BindingFlags.GetProperty, null, x, new object[1]{1}); 

e

x.GetType().InvokeMember(string.Empty, BindingFlags.InvokeMethod | BindingFlags.Default, null, x, new object[1]{0}); 

entrambi i quali sparare errori all'interno del controllo WebBrowser.

Grazie

+0

tenta di richiamare la "0" membro? (Proprio come con il membro "lunghezza".) –

+0

No: "0" causa anche un errore. –

risposta

5

invitiamo a consultare questa domanda SO:

Accessing properties of javascript objects using type dynamic in C# 4

Ho anche provato a recuperare i valori di proprietà sugli oggetti nella matrice senza successo. Il recupero di valori semplici nell'array, come stringhe e interi, è semplice, ma non ha avuto fortuna con oggetti complessi.

La soluzione migliore (IMO) è implementare una soluzione simile a quella nella domanda SO sopra. Invece di passare direttamente la matrice, crea un metodo Javascript che può essere richiamato da C# che restituirà l'oggetto nella matrice all'indice specificato. In questo modo:

C#

public void CSharpFunction(dynamic length) 
{ 
    for (int i = 0; i < length; i++) 
    { 
     dynamic obj = webBrowser1.Document.InvokeScript("getObj", new object[] { i }); 

     string val = obj.MyClassValue; 
    } 
} 

HTML/JavaScript

<script type="text/javascript"> 

var x = []; 
x.push({MyClassValue: "Hello"}); 
x.push({MyClassValue: "People"}); 

function test() { 
    window.external.CSharpFunction(x.length); 
} 

function getObj(i) { 
    return x[i]; 
} 

</script> 
<button onclick="test();" /> 
+0

Stavo cercando di evitare questo, ma sembra che sia il risultato più semplice in questo momento. Ho appena inserito una semplice funzione JavaScript: 'function GetItem (array, index) { return array [index]; } e lo chiama da C#: '_webBrowser.Document.InvokeScript (" GetItem ", nuovo oggetto [2] {array, indice});' –

Problemi correlati