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

时间:2010-11-04 23:29:50

标签: javascript silverlight serialization

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

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

现在,问题是options现在属于ScriptObject类型。如果我知道我的Javascript对象的属性名称是什么(我可以options.GetProperty(1)来获取第一个选项的标签),这不会是一个问题。但是,这不起作用,因为我需要两个值和选项的名称。有没有办法将其转换为Dictionary<int, string>或类似的东西?

2 个答案:

答案 0 :(得分:2)

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

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

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对象的最简单方法。

答案 1 :(得分:1)

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

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属性。