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

在WebBrowser控件内将字符串数组从JS传递到C#,c#,winforms,com,interop,C#,Winforms,Com,Interop,我正在使用ObjectForScript属性与WebBrowser控件内的网页交互,一切正常,只是我不知道如何将字符串数组传递回C# HTML代码 <input type="submit" onclick="window.external.save(Array('test', 'test2'))" /> 而不是与之斗争;也许从另一个角度来处理这个问题。。。你能(代替其中一个): 分隔数据(使用Array.join)并传递单个字符串,然后在C语言中拆分它(string.split)

我正在使用ObjectForScript属性与WebBrowser控件内的网页交互,一切正常,只是我不知道如何将字符串数组传递回C#

HTML代码

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

而不是与之斗争;也许从另一个角度来处理这个问题。。。你能(代替其中一个):

  • 分隔数据(使用
    Array.join
    )并传递单个字符串,然后在C语言中拆分它(
    string.split
    )#
  • 多次调用Save,每次接受一个字符串(
    Save(strings)
    ),然后调用最后一个方法来实际提交更改

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

<input type="submit" onclick="window.external.save({first: 'test', second: 'test2'})" />
未测试,但我认为您可以使用反射来发现成员


另请注意:

字符串数组会自动作为逗号分隔的字符串传递。 所以这个电话:

window.external.save(Array('test', 'test2'));
收到的答复如下:

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

这有点晚了,但通常当我需要传递对象时,或者在本例中是数组时,我会将它们作为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
}
private System.Collections.Generics.Queue\u argsQ;
public void InitArgs()
{
_argsQ=new System.Collections.Generics.Queue();
}
公共无效PushArg(字符串参数)
{
_argsQ.排队(arg);
}
公开无效最终结果()
{
字符串[]参数=_argsQ.ToArray();
//保存参数
}
现在可以从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();"...

…onclick=“var params=['test','test2'];window.external.InitArgs();用于(var i=0;iI可以。我怀疑你是在暗示,因为将对象从JS封送到.NET是一件棘手的事情,如果可行的话,不值得这么做。你是吗?@Sergej非常,是的。它不想按照你所展示的方式工作……所以不要这样做;pDid你找到了一种工作方法吗?不。我读了很多关于传回arra的负面回应返回到调用应用程序。最后,我得到了一个重新分解的程序,其中我有多个方法参数,而不是数组。它工作正常,我更喜欢它,而不是序列化和非序列化数据。
window.external.save(Array('test', 'test2'));
public void save(string fromjs)
{
    string[] result = fromjs.Split(',');
}
var sArr = JSON.stringify(myArr);
window.external(sArr);
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
}
...onclick="var params = ['test', 'test2']; window.external.InitArgs(); for (var i=0; i<params.length; i++) window.external.PushArg(params[i]); window.external.FinalArgs();"...