Udostępnij za pośrednictwem


Silverlight 1.0 とAJAXとの連携

現在、Silverlightを使い、ASP.NET AJAXとWebサービスとを連携させながらアプリケーションを開発しつつ、いろんな課題と向き合っています。
実装方法はいろいろとあるわけですが、Visual Studio 2005とSilverlight 1.0 RCという制約の中で実行可能性を探りながら進めています。
この制約においての実装ができたら、まだ正式版にはなっていないVisual Studio 2008とSilverlight 1.1との組み合わせでどういった変化が生じるのかをうまく考えることができるのではないかと仮説を立てているからです。

今、最大の課題は、Webサービス経由で取得したデータとSilverlightアプリケーションにおけるXAML要素へのデータバインディングです。

Silverlight 1.0 RCを利用してASP.NET AJAXと連携する場合、まだ正式版ではないVisual Studio 2008とASP.NET Futuresを組み合わせるとXAMLコントロールというのが使えるようにはなっています。https://quickstarts.asp.net/Futures/Silverlight/xaml01_wt.aspx
この組み合わせの選択だと、現時点で実装についての大部分で公式のサポートが得られません。

それを踏まえて、今、取り組んでいるのは、できる限り正式版の製品を組み合わせてデータ連携を行うSilverlightアプリケーションを開発するにはどうすればいいかというものです。言い方を変えると、新しい技術導入にあたり、サポートされていない製品の利用を少なくした上でどのように実装できるかということの検証になるのかもしれません。この制約の中でAJAXでデータ連携してSilverlight上で表示を行うには、SilverlightコントロールのCreateFromXAMLメソッドを使って、動的にXAMLの内容を更新するか、JavaScript上でXAML要素にアクセスして、値を変更するほかなさそうです。どちらにせよ、何らかのWebサービスのメソッドをJavaScriptから呼び出し、その結果を生データとして受けるか、XAMLデータとしての文字列として受けるか、どちらかしか選択肢はないように思います。

そうなると、ASP.NET AJAXを使ったWebアプリケーションとはちょっと異なり、Silverlightアプリケーションを実行している環境からJavaScriptでXML Webサービスを呼び出すことが一番の近道になるようです。つまりは、初期画面を生成し必要なスクリプトなどをクライアント環境に提供するWebアプリケーションと、クライアント環境でのユーザインターフェイスに絡む部分のデータ生成を行うWebサービスとを組み合わせることになります。

データバインディングを考えた場合、考慮すべき点が2つあります。

(1)XAML要素に名前を付けていく場合、既存のXAMLツリー上にある名前と重複しないこと
(2)UIとして見せる部分と内部で利用したデータがある場合、XAMLとは別でデータ構造を保持しておくこと

文字だけで表現するのはわかりづらいかもしれませんが、データとXAMLのテンプレートとを連結する形でXAMLを部分的に生成するようなことを考えた場合、テンプレート側のXAMLには、x:Nameによる指定が可能なのは、取り扱うデータの中でユニークなものに限る、ということです。もしかすると、私のやり方が間違っているのかもしれませんが、(1)に違反すると、SilverlightがRuntime errorを発生させ、エラーメッセージからは即座に意味がわかりません。言い方を変えると、データをクラスのインスタンスのように考えて、それをXAMLにマップさせようとして、インスタンスが一つなら問題にならないのですが、複数のインスタンスを同一のXAMLツリー上で管理する場合、x:Nameをプロパティ名のようにして使うことができないということです。

この制約があるために、アプリケーションで取り扱いたいデータの一部をXAML上に隠し持っておいて、スクリプトから参照しようと思っても、上述のように複数のインスタンスを扱う場合に、名前が重複しないようにしなければならないので、単純な方法でデータを取り出すことはできないと思います。このため、(2)で述べているように、見せるためのXAMLとアプリケーション上で取り扱いたいデータ構造、その両方を含めたデータの集まりを何らかのオブジェクトで管理する必要があります。

現時点での結論としては次のようになります。私の体験に基づくものであり、マイクロソフトの公式見解ではありません。

Silverlight 1.0RCレベルの仕様でAJAX連携でサーバから何らかのデータを取得して、データバインドした結果の変更分をXAMLにして受け取るような仕組みをつくるためには、取得したデータ+変更するXAMLの部分的な文字列、これをWebサービス側でひとまとめにして、Scriptからのアクセスに対応できるようにする、ということが望ましいかと思います。ここでいうところのAJAXは、JavaScriptからWebサービスを呼び出し、呼び出しの結果に応じたイベントハンドラで変更分を反映するということになるので、ASP.NET AJAXのようにコントロールを組み合わせて簡単に行うものとは異なり、必要なコードは開発者がすべて面倒を見ることになります。

このあたりは、近い将来、まとまった形で文書にしたいと思います。

Comments

  • Anonymous
    August 06, 2007
    Silverlight 1.1 AlphaとASP.NET Futures、Visual Studio 2008を組み合わせるとXAMLコントロールというのが使えるようにはなっています)ASP.NET Futures で利用されている XAML コントロールはどうやら Silverlight 1.0 対応のようですよー。既定の設定で XAML ファイルを設定して Silverlight 入れていない状態で実行すると 1.0 を入れてくれってあの画像が表示されました。どちらにしろ VS 2008 ベースになってしまうので ASP.NET AJAX + Silverlight 1.0 の手助けにはなりませんね。。。
  • Anonymous
    August 06, 2007
    naoki0311さん、ご指摘ありがとうございます。確かに、ASP.NET Futuresを確認するとSilverlight 1.0対応のようですね。ブログも後ほど修正します。