繁体   English   中英

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

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

使用C#反序列化JSON

为了传递一个数组,我发现这不是直接支持的。 我采用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();"...
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM