SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Ajax対応コントロール/コンポーネントの開発:Periodic Refreshパターン

定期リフレッシュを行うAjaxコンポーネントをASP.NETで開発する

ICallbackEventHandlerの実装

 AjaxNotifierコントロールでは、ICallbackEventHandlerインターフェースを実装することで、ASP.NET 2.0のクライアントコールバックメカニズムを利用してサーバへの非同期クライアントコールバックを行います。リスト3に、RaiseCallbackEventメソッドおよびGetCallbackResultメソッドのコードを示します。

リスト3 ICallbackEventHandlerのメソッドの実装
   protected virtual string GetCallbackResult()
   {
      return callbackResult;
   }
   protected virtual void RaiseCallbackEvent(string eventArgument)
   {
      IDataSource ds = (IDataSource)Page.FindControl(DataSourceID);
      int notificationId = int.Parse(eventArgument);
      if (notificationId < 0)
         notificationId = 1;
      Page.Session["NotificationId"] = notificationId;
      if (ds != null)
      {
         DataSourceView dv = ds.GetView(string.Empty);
         dv.Select(DataSourceSelectArguments.Empty, SelectCallback);
      }
   }

 AjaxNotifierは、DataSourceIDという名前の文字列プロパティを公開します。ページ開発者は、これを必要な表形式データソースコントロールのIDプロパティの値に設定しなければなりません。リスト3に示すように、RaiseCallbackEventメソッドは、ASP.NETの表形式データソースコントロールAPIを使用して、一般的な方法でデータストアからデータを取得します。これについては、このガイドで既に詳しく説明しました。RaiseCallbackEventメソッドの引数には、現在のユーザーに示されている最新の通知のIDを渡します。RaiseCallbackEventメソッドで、このID値をSessionオブジェクトに格納していることに注目してください。この必要性を理解するために、AjaxNotifierコントロールを使ったページを見てみましょう(リスト4)。エンドユーザーがこのページにアクセスすると、図1のダイアログが表示されます。

リスト4 AjaxNotifierコントロールを使ったページ
<%@ Page Language="C#" %>
<%@ Register TagPrefix="custom" Namespace="CustomComponents"
Assembly="CustomComponents" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
   <form id="form1" runat="server">
      <custom:AjaxNotifier runat="server" DataSourceID="MySource"
      DialogStyle-BackColor="LightGoldenrodYellow"
      DialogStyle-BorderColor="Tan" DialogStyle-BorderWidth="1px"
      DialogStyle-CellPadding="2" DialogStyle-CellSpacing="0"
      DialogStyle-BorderStyle="Groove" DialogStyle-ForeColor="Black"
      DialogStyle-GridLines="None" HeaderStyle-BackColor="Tan"
      HeaderStyle-Font-Bold="True"
         AlternatingItemStyle-BackColor="PaleGoldenrod" />
      <asp:SqlDataSource runat="server" ID="MySource"
       ConnectionString="<%$ connectionStrings:
                         MySqlConnectionString %>"
       SelectCommand="Select * From Notifications Where Id > @Id">
          <SelectParameters>
             <asp:SessionParameter Name="Id"
                  SessionField="NotificationId"
                Type="Int32" />
          </SelectParameters>
      </asp:SqlDataSource>
   </form>
</body>
</html>

 リスト4のページでは、AjaxNotifierコントロールをSqlDataSourceコントロールにバインドしています。<asp:SqlDataSource>タグのSelectCommand属性には、次のSelectSQLステートメントが含まれています。

Select * From Notifications Where Id > @Id

 このSQLステートメントには、@Idという名前のパラメータが含まれています。このパラメータの値は、現在のユーザーに示される最新の通知のIDです。リスト4に示したように、SqlDataSourceコントロールはSessionParameterを使用して、Sessionオブジェクトから通知IDを取得します。そのために、通知IDをSessionオブジェクトに格納しているのです。

<asp:SqlDataSource runat="server" ID="MySource"
 ConnectionString="<%$ connectionStrings:MySqlConnectionString %>"
 SelectCommand="Select * From Notifications Where Id > @Id">
   <SelectParameters>
     <asp:SessionParameter Name="Id" SessionField="NotificationId"
      Type="Int32" />
   </SelectParameters>
</asp:SqlDataSource>

 表形式データソースコントロールとポストされたデータとの間でデータをやり取りするための方法は、Sessionオブジェクトだけではありません。この作業を行う他の方法については、『Professional ASP.NET 2.0 Server Control and Component Development』の第27章「Developing Ajax-Enabled Controls and Components:Asynchronous Client Callback」で説明しています。リスト3に示したように、RaiseCallbackEventメソッドは、SelectCallbackメソッドをSelectデータ操作のコールバックとして登録します。このSelectCallbackメソッドの実装をリスト5に示します。このメソッドの主な仕事は、取得したデータレコードを使用してXMLドキュメントを生成し、クライアントに送信することです。つまり、クライアントとサーバは、XML形式でデータをやり取りします。

リスト5 SelectCallbackメソッド
private void SelectCallback(IEnumerable data)
{
   using (StringWriter sw = new StringWriter())
   {
      using (XmlWriter xw = XmlWriter.Create(sw))
      {
         xw.WriteStartDocument();
         xw.WriteStartElement("notification");
         IEnumerator iter = data.GetEnumerator();
         if (iter.MoveNext())
         {
            PropertyDescriptorCollection col =
                    TypeDescriptor.GetProperties(iter.Current);
            foreach (PropertyDescriptor pd in col)
            {
               if (pd.Name == "Source")
                  xw.WriteElementString("source",
                              (string)pd.GetValue(iter.Current));
              else if (pd.Name == "Notification")
                 xw.WriteElementString("summary",
                              (string)pd.GetValue(iter.Current));
              else if (pd.Name == "Id")
                 xw.WriteElementString("id",
                              pd.GetValue(iter.Current).ToString());
            }
         }
         xw.WriteEndElement();
         xw.WriteEndDocument();
      }
      callbackResult = sw.ToString();
   }
}

 従って、XMLドキュメントの構造または書式を決めることも、Ajax対応コントロールの開発者の仕事の1つとなります。リスト6に、AjaxNotifierコントロールがサポートするXMLドキュメントの例を示します。

リスト6 AjaxNotifierがサポートするXMLドキュメントの例
<notification>
   <id>3</id>
   <source>John</source>
   <summary>We'll meet tomorrow morning</summary>
</notification>

 他のすべてのXMLドキュメントと同じように、このXMLドキュメントも1つのドキュメント要素(<notification>)を持ち、この要素には、<id><source><summary>の3つの子要素が含まれています。

 リスト5に示したように、SelectCallbackメソッドは、『Professional ASP.NET 2.0 Server Control and Component Development』の第24章「Developing Custom Role Providers、Modules、and Principals」で説明したXmlWriterストリーミングAPIを使用してXMLドキュメントを生成します。生成されたXMLドキュメントはStringWriterにロードされます。SelectCallbackメソッドは、まず、XmlWriterのWriteStartDocumentメソッドを呼び出してドキュメントの開始を通知し、XML宣言を生成します。

xw.WriteStartDocument();

 次に、WriteStartElementメソッドを呼び出して、<notification>ドキュメント要素の開始タグを書き出します(リスト6を参照)。

xw.WriteStartDocument();

 その後、列挙オブジェクトにアクセスし、取得したデータを一般的な方法で列挙できるようにします。

IEnumerator iter = data.GetEnumerator();

 続いて、PropertyDescriptionCollectionコレクションを取得します。このコレクションには、取得したレコードのデータフィールドごとに1つのPropertyDescriptorオブジェクトが含まれています。

PropertyDescriptorCollection col =
        TypeDescriptor.GetProperties(iter.Current);

 次に、これらのPropertyDescriptorオブジェクトを反復処理し、<source>要素、<summary>要素、および<id>要素と、その内容を書き出します。

if (pd.Name == "Source")
   xw.WriteElementString("source",
   (string)pd.GetValue(iter.Current));
else if (pd.Name == "Notification")
   xw.WriteElementString("summary",
   (string)pd.GetValue(iter.Current));
else if (pd.Name == "Id")
   xw.WriteElementString("id",
   pd.GetValue(iter.Current).ToString());

次のページ
GetNotificationId JavaScript関数の再確認

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Shahram(Shahram)

ASP.NET、Webサービス、.NET テクノロジ、XMLテクノロジ、ADO.NET、C#、3Dコンピュータグラフィック、ヒューマンインターフェイス(HI)の有用性、および設計パターンを専門とするシニアソフトウェアエンジニア兼コンサルタント。業務の傍ら執筆活動も行う。オブジェクト指向分析、設計、プ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1518 2007/08/07 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー