代码之家  ›  专栏  ›  技术社区  ›  Steven Oxley

如何访问Silverlight中javascript对象的属性?

  •  2
  • Steven Oxley  · 技术社区  · 14 年前

    我正在访问一个javascript对象(其形式类似于: { 1 : "Option 1", 2 : "Option 2", 3 : "Option 3" } )使用类似于以下代码的Silverlight:

    dynamic window = HtmlPage.Window;
    var options = window.GlobalObject.getDropdownItems();
    

    现在,问题是 options 现在是类型 ScriptObject . 如果我知道我的javascript对象的属性名是什么(我可以这样做),这就不是问题了 options.GetProperty(1) 获取第一个选项的标签)。但是,这不起作用,因为我需要 二者都 选项的值和名称。有什么方法可以把它转换成 Dictionary<int, string> 或者类似的东西?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Joe McBride    14 年前

    是否可以更改选项的输入?如果你是,这就是我的建议。

    将值的输入更改为以下行中的某个值:

    function getDropdownItems() {
        var items = [{ Value: 1, Name: "Option 1" }, { Value: 2, Name: "Option 2" }, { Value: 3, Name: "Option 3"}];
        return items;
    }
    

    然后在Silverlight中,您可以轻松地将其转换为类型化对象。

    public class Option
    {
        public int Value { get; set; }
        public string Name { get; set; }
    }
    
    private void LoadOptions()
    {
        dynamic window = HtmlPage.Window;
        var dynamicoptions = window.getDropdownItems();
    
        ScriptObject scriptObject = dynamicoptions as ScriptObject;
    
        if (scriptObject != null)
        {
            var options = scriptObject.ConvertTo<Option[]>();
            if (options != null)
            {
            }
        }
    }
    

    我发现这是处理JavaScript对象最简单的方法。

        2
  •  1
  •   Steven Oxley    14 年前

    这就是我解决问题的方法。首先,我添加了一个名为 getKeysOfObject ,如下所示:

    var getKeysOfObject = function (o)
    {
        var keys = [], i;
        for (i in o) {
            keys.push(i);
        }
        return keys;
    }
    

    然后我使用这个函数来确定对象的键是什么。从那里,我可以很容易地从物体上得到我需要的信息。

    dynamic window = HtmlPage.Window;
    dynamic options = window.getDropDownItems();
    dynamic keys = window.getKeysOfObject(options);
    int numKeys = Convert.ToInt32((double)keys.length);
    
    for (int i = 0; i < numKeys; ++i)
    {
        if (options[keys[i]].GetType() == typeof(ScriptObject))
        {
            optionDictionary.Add(new KeyValuePair<int, string>(
                Convert.ToInt32((string)keys[i]),
                (string)options[keys[i]]);
        }
    }
    

    检查对象实际属性类型的原因是Silverlight添加了一个奇怪的 $__slid 对象的属性。