2010-09-23 3 views
6

Ich verwende ObjectForScripting -Eigenschaft, um mit Web-Seite im WebBrowser-Steuerelement zu interagieren, und alles funktioniert gut, außer ich kann nicht herausfinden, wie Array von Zeichenfolgen zurück an C#Übergeben Array von Zeichenfolgen von JS zu C# innerhalb WebBrowser Steuerelement

HTML-Code

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

Formular

// 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

Haben Sie gefunden, einen Arbeitsansatz? – Shrike

+0

Nein. Ich habe viele negative Antworten über das Zurückgeben von Arrays an die aufrufende Anwendung gelesen. Am Ende habe ich ein re-factored Programm, wo ich mehrere Methodenargumente anstelle von Array habe. –

Antwort

2

Anstatt es zu kämpfen; vielleicht nähern sich dem Problem aus einem anderen Blickwinkel ... man konnte (statt, entweder von):

  • abgrenzen die Daten (mit Array.join) und übergeben Sie einen einzigen String und teilen Sie es (string.Split) in der C#
  • Anruf mehrmals speichern, eine einzelne Zeichenfolge jedes Mal (Save(string s)) zu akzeptieren, dann eine endgültige Methode aufrufen, um tatsächlich
+0

könnte ich. Ich vermute, dass Sie dies vorschlagen, weil Objekte von JS an Marshalling.NET ist knifflig und lohnt sich nicht, wenn Workaround möglich ist. Bist du? –

+0

@Sergej ziemlich viel, ja. Es will nicht so funktionieren, wie du es zeigst ... also tu das nicht, 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(); 
} 

Referenz Sie die Änderungen: http://msdn.microsoft.com/en-us/library/zsfww439(v=vs.80).aspx

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

Dies sollte zu der Methode gehen.

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

Sie können ein anonymes Objekt anstelle einem Arrays auf der JavaScript-Seite verwenden:

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

Auf der C# Seite (Sie müssen .NET 4.0 oder mehr für den dynamischen oder Verwendung Typen verwenden. InvokeMember, wenn Sie auf einer älteren Version sind):

Nicht getestet, aber ich denke, dass Sie Reflexion verwenden können, um die Mitglieder zu entdecken.

Schauen Sie auch auf diese: http://dotnetacademy.blogspot.fr/2009/11/vbnetcnet-communication-with-javascript.html

+0

Es hat funktioniert und ich habe es bevorzugt, anstatt Daten zu serialisieren und zu deserialisieren. – ZeroWorks

0

Der String-Array automatisch als kommagetrennte Zeichenfolge übergeben wird. Also dieser Aufruf:

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

ist wie so erhalten:

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

Es ist ein bisschen spät für diese, aber in der Regel, wenn ich Objekte übergeben müssen oder, in diesem Fall Arrays, gebe ich sie als eine JSON-Zeichenfolge

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

Dann habe ich ein JavaScriptSerializer auf der anderen Seite, die sie zurück in ein Objekt/array deserialisiert.

Deserialize JSON with C#