我有一个标有ScriptableType&的Silverlight类。 ScriptableMember和我希望能够将对象从Silverlight传递给javascript。当我调用JSON.stringify(在javascript中)时,我希望收到对象的JSON表示,但我得到的只是{}
该类定义为:
[ScriptableType()]
public class MyEvent
{
[ScriptableMember(ScriptAlias = "eventContent")]
public int EventContent { get; set; }
}
我从Silverlight传递对象:
var jsonObject = new MyEvent { EventContent = 1 };
HtmlPage.Window.Invoke("publishValue", topic, jsonObject);
在javascript中,我正在执行以下操作:
alert(topic);
alert(jsonObject);
alert(JSON.stringify(jsonObject));
当我使用调试器时,我只看到类型为jsonObject
的{{1}},但调用Object
返回正确的类型,如果我访问属性alert(jsonObject)
,我会得到返回正确的值,但它没有使用jsonObject.eventContent
正确序列化。
任何人都说出我做错了什么?
我不想在发送到javascript之前在Silverlight中序列化对象。
干杯
AWC
答案 0 :(得分:2)
JSON.stringify
使用for...in
枚举对象的可枚举属性。如果属性不可枚举,则它们不会包含在结果字符串中。
Silverlight对象是外部对象,而不是本机javascript对象。就像ActiveXObject一样,属性不可发现/可枚举。我不确定是否有办法解决这个问题。我发现有几页提示实现IEnumerable以便能够使用本地语言中的foreach
进行迭代,但我不确定这是否会延续到JavaScript。
我不会依赖它是可能的,但你永远不会知道。如果您需要一个可枚举的对象,唯一的方法可能是使用System.Json
对其进行序列化,并在文档上调用eval
以在JavaScript中对其进行反序列化。
答案 1 :(得分:2)
我设法解决了这个问题!
而不是声明像这样的对象从Silverlight传递到javascript:
[ScriptableType()]
public class MyEvent
{
[ScriptableMember(ScriptAlias = "eventContent")]
public int EventContent { get; set; }
}
我使用System.Json
namepsace并创建一个JsonObject
,如下所示:
var ob = new JsonObject
{
{"eventContent", 1}
};
查看System.Json.JsonObject
的文档以获取更多信息。
干杯
AWC