2010-09-23 15 views
6

Używam właściwości ObjectForScripting do interakcji ze stroną internetową wewnątrz kontrolki WebBrowser i wszystko działa dobrze, z tym wyjątkiem, że nie mogę wymyślić, jak przekazać tablicę łańcuchów z powrotem do C#Przekazywanie tablicy łańcuchów z JS do C# wewnątrz kontrolki WebBrowser

HTML kod

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

Formularz

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

Czy znalazłeś podejście do pracy? – Shrike

+0

Nie. Odczytuję wiele negatywnych odpowiedzi dotyczących przekazywania tablic z powrotem do aplikacji wywołującej. W końcu skończyłem z re-factored programu, gdzie mam wiele argumentów metody zamiast tablicy. –

Odpowiedz

2

Zamiast walczyć; może podejść do problemu z innej strony ... mogłoby cię (zamiast, albo z):

  • ograniczają dane (z Array.join) i przekazać pojedynczy ciąg i podzielić ją (string.Split) w C#
  • wezwanie Zapisz wiele razy, przyjmując jeden ciąg znaków za każdym razem (Save(string s)), a następnie połączyć się z ostateczną metodę rzeczywiście zatwierdzić zmiany
+0

Mogę. Podejrzewam, że sugerujesz to, ponieważ marnujesz obiekty z JS do.NET jest trudny i nie warto, jeśli obejście jest możliwe. Jesteś? –

+0

@Sergej prawie tak, tak. Nie chce działać tak, jak pokazano ... więc nie rób tego; 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(); 
} 

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

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

To powinno przejść do metody.

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

Można użyć anonimowego obiekt zamiast tablicy Javascript strony:

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

Po stronie C# (trzeba użyć .NET 4.0 lub bardziej dynamicznego lub typ zastosowania. InvokeMember, jeśli używasz starszej wersji):

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

Nie testowałem, ale myślę, że możesz użyć refleksji, aby odkryć członków.

Również spojrzeć na to: http://dotnetacademy.blogspot.fr/2009/11/vbnetcnet-communication-with-javascript.html

+0

To działało i preferowałem to zamiast serializowania i dezaktywacji danych. – ZeroWorks

0

Tablica ciąg jest automatycznie przekazywana jako ciąg rozdzielany przecinkami. Więc to wezwanie:

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

jest odbierany tak:

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

To trochę późno, ale zazwyczaj gdy trzeba przekazać obiekty lub, w tym przypadku tablic, mijam je jako ciąg JSON.

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

Następnie mają JavaScriptSerializer z drugiej strony, że deserializes go w obiekt/tablicy.

Deserialize JSON with C#

Powiązane problemy