[英]Passing array of strings from JS to C# inside WebBrowser control
我正在使用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)
{
}
而不是打架; 也许从另一个角度来解决这个问题...你能(而不是):
Array.join
)并传递单个字符串,并在C#中将其拆分( string.Split
) Save(string s)
),然后调用最终方法实际提交更改 您可以在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
字符串数组自动以逗号分隔的字符串形式传递。 所以这个电话:
window.external.save(Array('test', 'test2'));
像这样收到:
public void save(string fromjs)
{
string[] result = fromjs.Split(',');
}
这有点晚了,但通常当我需要传递对象时,或者在这种情况下是Arrays,我将它们作为JSON字符串传递。
var sArr = JSON.stringify(myArr);
window.external(sArr);
然后我在另一边有一个JavaScriptSerializer
,它将它反序列化为一个对象/数组。
为了传递一个数组,我发现这不是直接支持的。 我采用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();"...
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)
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.