【问题标题】:Access JavaScript array elements from C# (via WebBrowser)?从 C#(通过 WebBrowser)访问 JavaScript 数组元素?
【发布时间】:2012-06-09 20:25:33
【问题描述】:

在表单上使用 WebBrowser 并通过 window.external 从 Javascript 调用 C#。在函数中传入一个 Javascript 类数组:

var x = [];
x.push(classa);
x.push(classa);

window.external.CSharpFunction(x);

我可以通过以下方式在 C# 中成功获取 x.length:

int length=(int)x.GetType().InvokeMember("length", BindingFlags.GetProperty, null, x, null);

我的问题是如何获得 x[0] 和 x[1]? 我试过了

x.GetType().InvokeMember(string.Empty, BindingFlags.GetProperty, null, x, new object[1]{1});

x.GetType().InvokeMember(string.Empty, BindingFlags.InvokeMethod | BindingFlags.Default, null, x, new object[1]{0});

这两者都会触发 WebBrowser 控件中的错误。

谢谢

【问题讨论】:

  • 尝试调用“0”成员? (就像“长度”成员一样。)
  • 否:“0”也会导致错误。

标签: c# javascript com browser


【解决方案1】:

请看这个问题:

Accessing properties of javascript objects using type dynamic in C# 4

我还尝试从数组中对象的属性中检索值,但没有成功。检索数组中的简单值(例如字符串和整数)很容易,但对于复杂对象就没有运气了。

您最好的选择 (IMO) 是实施与上述 SO 问题中的解决方案类似的解决方案。与其直接传递数组,不如构建一个可以从 C# 调用的 Javascript 方法,该方法将返回数组中指定索引处的对象。像这样:

C#

public void CSharpFunction(dynamic length)
{
    for (int i = 0; i < length; i++)
    {
        dynamic obj = webBrowser1.Document.InvokeScript("getObj", new object[] { i });

        string val = obj.MyClassValue;
    }
}

HTML / JavaScript

<script type="text/javascript">

var x = [];
x.push({MyClassValue: "Hello"});
x.push({MyClassValue: "People"});

function test() {
  window.external.CSharpFunction(x.length);
}

function getObj(i) {
  return x[i];
}

</script>
<button onclick="test();" />

【讨论】:

  • 我试图避免这种情况,但它现在看起来是最简单的结果。我只是输入了一个简单的 JavaScript 函数:function GetItem(array,index) { return array[index]; } 并从 C# 调用它:_webBrowser.Document.InvokeScript("GetItem", new object[2] { array, index });
猜你喜欢
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
相关资源
最近更新 更多