2010-09-23 10 views
6

Estoy usando la propiedad ObjectForScripting para interactuar con la página web dentro del control WebBrowser y todo funciona bien, excepto que no puedo resolver cómo pasar una matriz de cadenas a C#Pasando una matriz de cadenas de JS a C# dentro del control WebBrowser

código HTML

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

Formulario

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

¿Ha encontrado un enfoque de trabajo? – Shrike

+0

No. Leí muchas respuestas negativas sobre la devolución de matrices a la aplicación de llamadas. Al final terminé con un programa rediseñado donde tengo múltiples argumentos de método en lugar de una matriz. –

Respuesta

2

En lugar de luchar contra ella; tal vez abordar el problema desde otro ángulo ... podría usted (en su lugar, ya sea de):

  • delimitan los datos (con Array.join) y pasar una sola cadena y dividirlo (string.Split) en el C#
  • llamada Guardar en múltiples ocasiones, la aceptación de una sola cadena cada vez (Save(string s)), a continuación, llamar a un método final para cometer realidad los cambios
+0

Podría. Sospecho que estás sugiriendo eso porque ordenar objetos de JS a.NET es complicado y no vale la pena si la solución es posible. ¿Eres tú? –

+0

@Sergej casi, sí. No quiere funcionar de la manera que se muestra ... así que no lo haga; 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(); 
} 

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

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

Esto debería ir al método.

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

puede utilizar un objeto anónimo lugar de una matriz en el lado javascript:

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

En el lado C# (es necesario utilizar .NET 4.0 o más para el tipo dinámico o uso. InvokeMember si usted está en una versión anterior):

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

No se ha probado, pero creo que se puede utilizar la reflexión para descubrir los miembros.

también un vistazo a esto: http://dotnetacademy.blogspot.fr/2009/11/vbnetcnet-communication-with-javascript.html

+0

Funcionó y lo preferí en lugar de serializar y deserializar datos. – ZeroWorks

0

La matriz de cadenas se pasa automáticamente como una cadena delimitada por comas. Así que esta llamada:

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

se recibe de este modo:

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

Es un poco tarde para esto, pero por lo general cuando tengo que pasar objetos o, en este caso las matrices, las he dejado pasar como una cadena JSON.

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

entonces tengo una JavaScriptSerializer en el otro lado que deserializa de nuevo en un objeto/matriz.

Deserialize JSON with C#

Cuestiones relacionadas