在WebBrowser控件中将字符串数组从JS传递到C#

时间:2010-09-23 09:23:30

标签: c# winforms com interop

我正在使用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)
{
}

6 个答案:

答案 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,将它反序列化为一个对象/数组。

Deserialize JSON with C#

答案 5 :(得分:0)

要传递数组,我发现它不直接受支持。我采用了马克·格雷夫(Marc Gravell)推荐的方法来多次调用,但改用3种方法构造它,这些方法依次使用:InitArgsPushArg(多次),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();"...