【问题标题】:Passing array of strings from JS to C# inside WebBrowser control在 WebBrowser 控件中将字符串数组从 JS 传递到 C#
【发布时间】:2010-09-23 09:23:30
【问题描述】:

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

【问题讨论】:

  • 你找到可行的方法了吗?
  • 没有。我阅读了许多关于将数组传回调用应用程序的负面回应。最后我得到了重构程序,其中我有多个方法参数而不是数组。

标签: c# winforms com interop


【解决方案1】:

与其抗争;也许从另一个角度解决问题......你可以(而不是):

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

【讨论】:

  • 我可以。我怀疑您的建议是因为将对象从 JS 编组到 .NET 很棘手,如果可以解决问题,则不值得。你是吗?
  • @Sergej 差不多,是的。它不想按照你展示的方式工作......所以不要那样做;p
【解决方案2】:

您可以在 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

【讨论】:

  • 它有效,我更喜欢它而不是序列化和反序列化数据。
【解决方案3】:
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)
{
}

【讨论】:

    【解决方案4】:

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

    window.external.save(Array('test', 'test2'));
    

    这样收到的:

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

    【讨论】:

      【解决方案5】:

      这有点晚了,但通常当我需要传递对象时,或者在本例中是数组时,我将它们作为 JSON 字符串传递。

      var sArr = JSON.stringify(myArr);
      window.external(sArr);
      

      然后我在另一边有一个JavaScriptSerializer 将其反序列化回一个对象/数组。

      Deserialize JSON with C#

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-23
          • 1970-01-01
          • 2010-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-13
          • 1970-01-01
          相关资源
          最近更新 更多