2010-09-23 2 views
6

Sto utilizzando la proprietà ObjectForScripting di interagire con la pagina web all'interno di controllo del browser web e tutto funziona bene, tranne che non riesco a capire come passare array di stringhe di nuovo a C#Passando array di stringhe da JS per C# all'interno controllo WebBrowser

codice HTML

<input type="submit" onclick="window.external.save(Array('test', 'test2'))" /> 

Modulo

// Returns System.__ComObject 
public void Save(object parameters) 
{ 
} 

// Throws an exception 
public void Save(object[] parameters) 
{ 
} 

// Also throws an exception 
public void Save(string[] parameters) 
{ 
} 
+0

Hai trovato un approccio di lavoro? – Shrike

+0

No. Ho letto molte risposte negative su come restituire gli array all'applicazione chiamante. Alla fine ho finito con il programma ri-factored in cui ho più argomenti di metodo invece di array. –

risposta

2

Invece di combatterlo; forse affrontare il problema da un'altra angolazione ... potrebbe voi (invece, uno dei):

  • delimitare i dati (con Array.join) e passare una singola stringa , e dividerlo (string.Split) in C#
  • chiamata Save più volte, accettando una singola stringa ogni volta (Save(string s)), quindi chiamare un metodo finale a commettere effettivamente le modifiche
+0

Potrei. Sospetto che lo stiate suggerendo a causa del marshalling di oggetti da JS a.NET è ingannevole e non ne vale la pena se la soluzione è possibile. Tu sei? –

+0

@Sergej praticamente sì. Non vuole funzionare come si sta mostrando ... quindi non farlo; p –

0
function JS2VBArray(objJSArray) 
{ 
    var dictionary = new ActiveXObject("Scripting.Dictionary"); 
    for (var i = 0; i < objJSArray.length; i++) 
    { 
     dictionary.add(i, objJSArray[ i ]); 
    } 

    return dictionary.Items(); 
} 

Riferimento: http://msdn.microsoft.com/en-us/library/zsfww439(v=vs.80).aspx

<input type="submit" onclick="window.external.Save(JS2VBArray(['test', 'test2']))" /> 

Questo dovrebbe andare al metodo.

public void Save(object[] parameters) 
{ 
} 
1

è possibile utilizzare un oggetto anonimo, invece di una matrice sul lato javascript:

<input type="submit" onclick="window.external.save({first: 'test', second: 'test2'})" /> 

Sul lato C# (è necessario utilizzare NET 4.0 o superiore per il tipo dinamico o l'uso. InvokeMember se siete su una versione precedente):

public void Save(dynamic parameters) 
{ 
    MessageBox.Show(parameters.first); 
    MessageBox.Show(parameters.second); 
} 

non testato, ma penso che si può utilizzare la reflection per scoprire i membri.

un'occhiata anche a questo: http://dotnetacademy.blogspot.fr/2009/11/vbnetcnet-communication-with-javascript.html

+0

Ha funzionato e l'ho preferito invece di serializzare e non serializzare i dati. – ZeroWorks

0

La matrice stringa viene passato automaticamente come una stringa delimitata da virgole. Quindi questa chiamata:

window.external.save(Array('test', 'test2')); 

ricevuto in questo modo:

public void save(string fromjs) 
{ 
    string[] result = fromjs.Split(','); 
} 
0

E 'un po' tardi per questo, ma in genere quando ho bisogno di passare oggetti o, in questo caso Array, li passa come una stringa JSON.

var sArr = JSON.stringify(myArr); 
window.external(sArr); 

poi ho un JavaScriptSerializer sull'altro lato che deserializza di nuovo in un oggetto/array.

Deserialize JSON with C#