最近在做Silverlight应用,需要用Silverlight调用页面中Javascript方法。这 个JS方法返回一个对象数组给Silverlight。对于这个对象数组怎么在Silverlight里处理这个问题纠结了一阵子,通过搜索,在微软开发 者社区里找到了方法。 测试用的JS方法如下: 1: function test() { 2: var testObjectCollection = []; 3: for (var i = 0; i < 10; i++) { 4: var testObject = new Object(); 5: testObject.Field1 = "Field1_" + i; 6: testObject.Field2 = "Field2_" + i; 7: testObjectCollection[testObjectCollection.length] = testObject; 8: } 9: return testObjectCollection; 10: }; 代码中设计了一个对象testObject,对象包含两个属性Field1和Field2。因此会很容易想到在Silverlight也创建一个结构相同的类: 1: public class TestObject 2: { 3: public string Field1 { get; set; } 4: public string Field2 { get; set; } 5: } 准备工作到这里结束。 在Silverlight里调用JS方法的代码如下: 1: object returnedValue = HtmlPage.Window.Invoke("test", null); 第一个参数是JS方法名,第二个参数是params object[]类型的,是JS方法的参数列表。Invoke方法返回值的是object类型,很容易想到会用下面的方法转换: 1: List<TestObject> testObjectCollection = returnedValue as List<TestObject>; 但是会发现testObjectCollection变量是null,而returnedValue并不为null,转换失败了。 通过调试发现,returnedValue类型为 System.Windows.Browser.ScriptObject,也就是说Invoke方法返回值实际上是不单纯是个object,而是 ScriptObject。ScriptObject类有个ConvertTo方法可以用来转换。关于System.Windows.Browser.ScriptObject类型详细信息,可以去查MSDN。 于是我尝试如下方法: 1: ScriptObject returnedValue = HtmlPage.Window.Invoke("test", null) as ScriptObject; 2: List<TestObject> objects = returnedValue.ConvertTo<List<TestObject>>(); 调试结果如下: 很明显,转换成功了。剩下的事情就是按业务需求来处理了。 |
相关文章
- 从Console App或SQLCLR对象调用函数时处理连接的最佳方法(“Context Connection = true”)
- JMeter中返回Json数据的处理方法(转)
- js 中数组对象的定义赋值 以及方法
- JS中判断对象是不是数组的方法
- 整理 js 日期对象的详细功能,使用 js 日期对象获取具体日期、昨天、今天、明天、每月天数、时间戳等,以及常用的日期时间处理方法
- (转)js数组与字符串的相互转换方法
- js使用Array.prototype.sort()对数组对象排序的方法
- TFS Release 步骤调用命令行返回失败信息的处理方法
- python调用c++ ctype list传数组或者返回数组的方法
- [转]html页面调用js文件里的函数报错onclick is not defined处理方法