我正在使用类似于以下内容的代码访问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>
或类似的东西?
答案 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
属性。