2010-09-23 114 views
6

我使用ObjectForScripting属性与WebBrowser控件内的网页进行交互,并且一切正常,但我无法弄清楚如何将字符串数组传回C#从JS到C#中传递字符串数组到WebBrowser控件

HTML代码

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

形式

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

你找到一个工作方法? – Shrike 2011-03-22 15:28:52

+0

不,我读了许多有关将数组传回给调用应用程序的负面响应。最后,我结束了重新考虑因素的程序,其中我有多个方法参数而不是数组。 – 2011-03-27 15:56:24

回答

2

而不是打它;也许从另一个角度解决这个问题......你能(而不是,任):

  • 分隔数据(与Array.join),并通过一个单一,并在C#
  • 它( string.Split)分裂
  • 呼叫保存多次,接受单个串中的每个时间(Save(string s)),则调用一个方法最终实际提交更改
+0

我可以。我怀疑你是建议,因为编组对象从JS到。NET是棘手的,如果解决方法是可行的,不值得。你是? – 2010-09-23 09:37:20

+0

@Sergej差不多,是的。它不想按照你所显示的方式工作......所以不要这样做; p – 2010-09-23 09:48:00

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(); 
} 

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

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

这应该去的方法。

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

您可以使用匿名对象,而不是在JavaScript端的数组:

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

在C#侧(你需要使用.NET 4.0以上的动态或使用类型。 InvokeMember如果你是在一个较旧的版本):

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

未经测试,但我认为你可以使用反射来发现成员。

也期待在此:http://dotnetacademy.blogspot.fr/2009/11/vbnetcnet-communication-with-javascript.html

+0

它的工作原理和我首选它而不是序列化和反序列化数据。 – ZeroWorks 2016-08-29 16:38:23

0

字符串数组被自动为逗号分隔的字符串通过。 所以这个电话:

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

收到像这样:

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

这是一个有点晚了这一点,但通常当我需要传递对象,或者在这种情况下阵,我将它们作为一个JSON字符串。

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

然后我对反序列化回对象/阵列的另一侧有一个JavaScriptSerializer

Deserialize JSON with C#