印刷用ページ      送信     
クリックして評価とフィードバックをお寄せください
MSDN
MSDN ライブラリ
テクニカルドキュメント
.NET 開発
プログラミング Tips
 クライアント・コールバックで複数の値をクライアントへ渡す方法
クライアント・コールバックで複数の値をクライアントへ渡す方法

最終更新日 2006 年 3 月 15 日

download1.gif サンプル コードのダウンロード (aspnettips_ClientCallback2.msi, 258 KB)

※このサンプルをお使いいただくためには、Visual Studio 2005 が必要です。

ページをリロードせずにサーバーとやり取りする方法については、ページをリロードせずにサーバーとやり取りする方法で紹介しました。ここで紹介したクライアント・コールバックは、パラメータとして 1つの文字列をサーバーからクライアントへ戻すものでした。

しかし、例えばデータベースのキーをサーバーへ投げ、該当するレコードの複数のフィールド値を取得したい場合には、どうすればよいでしょうか。そこで、今回は、クライアント・コールバックの機能を使い、複数の値をクライアントへ渡す方法を紹介します。

サンプル フォームの準備

まず、項目を選択すると、コールバックするリスト ボックスを用意します。次に項目が選択されると対応する画像を表示するイメージ コントロールと、画像の名称を表示するテキスト ボックスを用意します(リスト1、リスト2、および図1)。

したがって、今回は、画像のパスと画像の名称の 2つの値をコールバック値として受け取る必要があります。

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="ClientCallback.aspx.vb" Inherits="_ClientCallback" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html  >
<head runat="server">
    <title>Sample Page</title>
    <script type="text/javascript">
        function ChangeImage()
        {
            var lb = document.MyForm.ListImage;
            var imageNo = lb.options[lb.selectedIndex].value
            CallServer(imageNo, "");
        }
        function ReceiveServerData(rcvValue)
        {

        }
    </script>
</head>
<body>
    <form id="MyForm" runat="server">
        <table border="1">
            <tr>
                <td>
                    画像番号
                </td>
                <td>
                    <select size="4" name="ListImage" onchange="ChangeImage();">
                        <option value="1">画像1</option>
                        <option value="2">画像2</option>
                        <option value="3">画像3</option>
                    </select>
                </td>
            </tr>
            <tr>
                <td>
                    イメージ
                </td>
                <td>
                    <asp:Image ID="Image1" runat="server" ImageUrl="dummy.gif" />
                </td>
            </tr>
            <tr>
                <td>
                    名称
                </td>
                <td>
                    <asp:TextBox ID="TextImageName" Runat="server"></asp:TextBox>
                </td>
            </tr>
        </table>
  </form>
</body>
</html>

リスト1.ClientCallback.aspx

Partial Class _ClientCallback
    Inherits System.Web.UI.Page
    Implements System.Web.UI.ICallbackEventHandler

    Private returnValue As String

    Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent

    End Sub	

    Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult

        Return returnValue

    End Function

    Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim cbReference As String
        cbReference = Page.ClientScript.GetCallbackEventReference(Me, "arg", "ReceiveServerData", "context")
        Dim callbackScript As String = ""
        callbackScript &= "function CallServer(arg, context) { " & cbReference & "} ;"
        Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "CallServer", callbackScript, True)
    End Sub

End Class

リスト2.ClientCallback.aspx.vb

図

図 1. ClientCallback.aspx のデザイナ画面

サーバー コールバック メソッドで複数の値を結合する

リスト2 のコードでは、RaiseCallbackEvent に処理を実装していないので、ここでコールバック値を作成しましょう。今回は、画像のパス以外に、画像の名称も戻す必要がありますが、クライアントに戻せるコールバック値は 1つの文字列のみです。そこで、改行コードを値の仕切りとして使い、複数の値を結合した文字列を作成してクライアントに戻すことにします(リスト3)。

Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent

        Dim strName As String = ""
        Dim strFile As String = "dummy.gif"

        Select Case eventArgument
            Case 1
                strName = "円形"
                strFile = "円.gif"
            Case 2
                strName = "三角形"
                strFile = "三角.gif"
            Case 3
                strName = "四角形"
                strFile = "四角.gif"
        End Select

        ' 改行コードを区切りにして複数パラメータを渡す
        returnValue = strName
        returnValue += vbCrLf       ' 改行コード
        returnValue += strFile

    End Sub

リスト3.ClientCallback.aspx.vb に追加するコード

クライアント コールバック メソッドで複数の値を分離する

リスト1 のコードでは、ReceiveServerData に処理を実装していないので、ここで受け取ったコールバック値を複数の値に分離します(リスト4)。分離した値は、結合した順番に格納された文字列の配列になります。もし、パラメータとして数値を受け取りたい場合には、ここで型変換の処理を行う必要があります。

<script type="text/javascript">
        function ReceiveServerData(rcvValue)
        {
            rcvValues = rcvValue.split(unescape("%0D%0A"));
            document.MyForm.TextImageName.value = rcvValues[0];
            document.MyForm.Image1.src = rcvValues[1];
        }
    </script>

リスト4.ClientCallback.aspx に追加するコード

完成した ClientCallback.aspx と ClientCallback.aspx.vb は、リスト5 およびリスト6 になり、実行結果は図2 のようになります。

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="ClientCallback.aspx.vb" Inherits="_ClientCallback" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html  >
<head runat="server">
    <title>Sample Page</title>
    <script type="text/javascript">
        function ChangeImage()
        {
            var lb = document.MyForm.ListImage;
            var imageNo = lb.options[lb.selectedIndex].value
            CallServer(imageNo, "");
        }

        function ReceiveServerData(rcvValue)
        {
            rcvValues = rcvValue.split(unescape("%0D%0A"));
            document.MyForm.TextImageName.value = rcvValues[0];
            document.MyForm.Image1.src = rcvValues[1];
        }
    </script>
</head>
<body>
    <form id="MyForm" runat="server">
        <table border="1">
            <tr>
                <td>
                    画像番号
                </td>
                <td>
                    <select size="4" name="ListImage" onchange="ChangeImage();">
                        <option value="1">画像1</option>
                        <option value="2">画像2</option>
                        <option value="3">画像3</option>
                    </select>
                </td>
            </tr>
            <tr>
                <td>
                    イメージ
                </td>
                <td>
                    <asp:Image ID="Image1" runat="server" ImageUrl="dummy.gif" />
                </td>
            </tr>
            <tr>
                <td>
                    名称
                </td>
                <td>
                    <asp:TextBox ID="TextImageName" Runat="server"></asp:TextBox>
                </td>
            </tr>
        </table>
  </form>
</body>
</html>

リスト5.ClientCallback.aspx

Partial Class _ClientCallback
    Inherits System.Web.UI.Page
    Implements System.Web.UI.ICallbackEventHandler

    Private returnValue As String

    Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent

        Dim strName As String = ""
        Dim strFile As String = "dummy.gif"

        Select Case eventArgument
            Case 1
                strName = "円形"
                strFile = "円.gif"
            Case 2
                strName = "三角形"
                strFile = "三角.gif"
            Case 3
                strName = "四角形"
                strFile = "四角.gif"
        End Select

        ' 改行コードを区切りにして複数パラメータを渡す
        returnValue += strName
        returnValue += vbCrLf       ' 改行コード
        returnValue += strFile
    End Sub

    Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult

        Return returnValue

    End Function

    Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim cbReference As String
        cbReference = Page.ClientScript.GetCallbackEventReference(Me, "arg", "ReceiveServerData", "context")
        Dim callbackScript As String = ""
        callbackScript &= "function CallServer(arg, context) { " & cbReference & "} ;"
        Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "CallServer", callbackScript, True)

    End Sub

End Class

リスト6.ClientCallback.aspx.vb

図

図 2. ClientCallback.aspx の実行結果

© 2008 Microsoft Corporation.All rights reserved. 使用条件  |  商標  |  プライバシー
Page view tracker