Sliverlight Interop 1-Javascript端傳送字串陣列參數到Silverlight

【先修課程】

關於本文中提到由Javascript呼叫Silverlight端程式的技巧,可以參考MSDN上的說明與教學:

【本文開始】

寫了個Silverlight 3的Mehod供Javascript呼叫,其中一個參數想設定成string[],依據文件的說明"JavaScript 陣列會轉換成 object[]"。原本預期Javascript端呼叫plugin.Content.MyManagedObject.MyMethod(["A","B"]),宣告成public void MyMethod(object[] ary)就可搞定,沒想到測試失敗,得到:

This object cannot be converted to the specified type 'System.Object[]'

研究之後,發現一個可行做法是接入ScriptObject,再利用ScriptObject.ConvertTo<string[]>轉換。測試程式碼如下:

MainPage.xaml.cs

    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            JavascriptSidekick jssk = new JavascriptSidekick();
            if (HtmlPage.IsEnabled)
                HtmlPage.RegisterScriptableObject(
                    "JavascriptSidekick", jssk);
        }
    }

JavascriptSidekick.cs

    public class JavascriptSidekick
    {
        public string[] ConvertToStringArray(ScriptObject obj)
        {
            return obj.ConvertTo<string[]>();
        }
        [ScriptableMember]
        public string Test1(ScriptObject obj)
        {
            return string.Join(",", ConvertToStringArray(obj));
        }
        [ScriptableMember]
        public string Test2(object[] ary)
        {
            return string.Join(",", 
                ary.Select(s => s.ToString()).ToArray());
        }
    }

網頁中的Script端測試:

function onSilverlightLoad(sender, args) {
    var slCtl = sender.getHost();
    var jssk = slCtl.Content.JavascriptSidekick;
    
    alert(jssk.Test1(["A","B","C"]));
    alert(jssk.Test1([]));
    
    //失敗
    //NullReferenceException
    alert(jssk.Test1(null)); 
    
    //失敗 ArgumentException
    //Invalid args for this operation.
    alert(jssk.Test1()); 
    
    //失敗 ArgumentException
    //This object cannot be converted to 
    //the specified type 'System.Object[]'
    alert(jssk.Test2(["A","B","C"]));
}        

最後,補充一篇透澈剖析Silverlight Interoperability的好文章: Silverlight interoperability

歡迎推文分享:
Published 28 April 2010 08:47 AM 由 Jeffrey
Filed under: ,
Views: 8,956



意見

# Phoenix said on 27 April, 2010 08:06 PM

原來是這樣,之前還笨笨的先用逗號串起來傳送說@@

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<April 2010>
SunMonTueWedThuFriSat
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication