我正在使用ObjectForScripting属性与WebBrowser控件内的网页进行交互,一切正常,但我无法弄清楚如何将字符串数组传递回C#
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 :(得分:2)
而不是打架;也许从另一个角度来解决问题...你能(而不是):
Array.join
)并传递单个字符串,并在C#中将其拆分(string.Split
)Save(string s)
),然后调用最终方法实际提交更改答案 1 :(得分:1)
您可以在javascript端使用匿名对象而不是数组:
<input type="submit" onclick="window.external.save({first: 'test', second: 'test2'})" />
在C#端(您需要使用.NET 4.0或更高版本的动态或使用Type.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
答案 2 :(得分: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)
{
}
答案 3 :(得分:0)
字符串数组自动以逗号分隔的字符串形式传递。 所以这个电话:
window.external.save(Array('test', 'test2'));
像这样收到:
public void save(string fromjs)
{
string[] result = fromjs.Split(',');
}
答案 4 :(得分:0)
这有点晚了,但通常当我需要传递对象时,或者在这种情况下是Arrays,我将它们作为JSON字符串传递。
var sArr = JSON.stringify(myArr);
window.external(sArr);
然后我在另一边有一个JavaScriptSerializer
,将它反序列化为一个对象/数组。
答案 5 :(得分:0)
要传递数组,我发现它不直接受支持。我采用了马克·格雷夫(Marc Gravell)推荐的方法来多次调用,但改用3种方法构造它,这些方法依次使用:InitArgs
,PushArg
(多次),FinalArgs
。>
private System.Collections.Generics.Queue<string> _argsQ;
public void InitArgs()
{
_argsQ = new System.Collections.Generics.Queue<string>();
}
public void PushArg(string arg)
{
_argsQ.Enqueue(arg);
}
public void FinalArgs()
{
string[] parameters = _argsQ.ToArray();
// Save parameters
}
现在可以从html / js依次使用方法调用:
...onclick="var params = ['test', 'test2']; window.external.InitArgs(); for (var i=0; i<params.length; i++) window.external.PushArg(params[i]); window.external.FinalArgs();"...