Beispielimplementierung eines Clientrückrufs (C#)

Aktualisiert: November 2007

Zeigt eine ASP.NET-Webseite, die einen Clientrückruf implementiert. Weitere Informationen finden Sie unter Programmgesteuertes Implementieren von Clientrückrufen ohne Postbacks in ASP.NET-Webseiten.

Beispiel

Beschreibung

Das folgende Codebeispiel besteht aus zwei Teilen. Der erste Teil des Beispiels zeigt eine ASP.NET-Webseite (die ASPX-Seite). Der zweite Teil zeigt die entsprechende Code-Behind-Datei (die ASPX.CS-Datei).

Code

<%@ Page Language="C#" AutoEventWireup="true" 
  CodeFile="ClientCallback.aspx.cs" Inherits="ClientCallback" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 
  1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" >
  <title>Client Callback Example</title>
  <script type="text/ecmascript">
    function LookUpStock()
    {
        var lb = document.getElementById("ListBox1");
        var product = lb.options[lb.selectedIndex].text;
        CallServer(product, "");
    }

    function ReceiveServerData(rValue)
    {   
        document.getElementById("ResultsSpan").innerHTML = rValue;

    }
  </script>
</head>
<body>
  <form id="form1" >
    <div>
      <asp:ListBox ID="ListBox1" Runat="server"></asp:ListBox>
      <br />
      <br />
      <button type="Button" onclick="LookUpStock()">Look Up Stock</button>
      <br />
      <br />
      Items in stock: <span id="ResultsSpan" ></span>
      <br />
    </div>
  </form>
</body>
</html>
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class ClientCallback : System.Web.UI.Page,
     System.Web.UI.ICallbackEventHandler
{
    protected System.Collections.Specialized.ListDictionary catalog;
    protected String returnValue;
    protected void Page_Load(object sender, EventArgs e)
    {
        String cbReference =
            Page.ClientScript.GetCallbackEventReference(this,
            "arg", "ReceiveServerData", "context");
        String callbackScript;
        callbackScript = "function CallServer(arg, context)" +
            "{ " + cbReference + ";}";
        Page.ClientScript.RegisterClientScriptBlock(this.GetType(),
            "CallServer", callbackScript, true);

        catalog = new System.Collections.Specialized.ListDictionary();
        catalog.Add("monitor", 12);
        catalog.Add("laptop", 10);
        catalog.Add("keyboard", 23);
        catalog.Add("mouse", 17);

        ListBox1.DataSource = catalog;
        ListBox1.DataTextField = "key";
        ListBox1.DataBind();

    }

    public void RaiseCallbackEvent(String eventArgument)
    {
        if (catalog[eventArgument] == null)
        {
            returnValue = "-1";
        }
        else
        {
            returnValue = catalog[eventArgument].ToString();
        }
    }
    public String GetCallbackResult()
    {
        return returnValue;
    }
}

Kommentare

Die Webseite emuliert eine Datenbanksuche, um für einige Produkte (Monitore, Tastaturen usw.) die Anzahl der verfügbaren oder vorrätigen Artikel zu bestimmen. Um das Codebeispiel zu vereinfachen, wird die Datenbank als Wörterbuchliste dargestellt, die nur einige wenige Elemente enthält. Für jeden Artikel in der Tabelle ist der Artikelname der Schlüssel (z. B. Monitor), und der Wert beschreibt die Anzahl der vorrätigen Artikel. In einer Betriebsanwendung würde stattdessen eine Datenbank verwendet werden.

Beim Ausführen der Seite wird ein ListBox-Steuerelement an die Hashtabelle gebunden, damit das ListBox-Steuerelement die Produktliste anzeigen kann. Die Seite enthält außerdem ein button-Element (kein Button-Webserversteuerelement), dessen onclick-Ereignis an die LookUpStock-Clientfunktion gebunden ist. Wenn der Benutzer auf diese Schaltfläche klickt, wird über die Schaltfläche die LookUpStock-Funktion ausgelöst, um die aktuelle Auswahl des Listenfelds abzurufen. Anschließend wird ein Clientrückruf ausgeführt, indem die CallServer-Funktion aufgerufen wird.

Die Code-Behind-Seite fügt der Seite über die RegisterClientScriptBlock-Methode Clientskript hinzu. Das hinzugefügte Skript enthält die CallServer-Funktion, die von der GetCallbackEventReference-Methode den Namen der Methode abruft, die das Postback an den Server durchführt.

Der Clientrückruf ruft die RaiseCallbackEvent-Methode auf, die den verfügbaren Bestand für den an sie übergebenen Artikel ermittelt. Die GetCallbackResult-Methode gibt den Wert zurück. Beachten Sie, dass es sich bei den Argumenten, die zwischen Clientskript und Servercode hin und her gesendet werden, nur um Zeichenfolgen handeln darf. Sie können mehrere Werte gleichzeitig eingeben oder empfangen, wenn Sie in der Eingabezeichenfolge bzw. in der Ausgabezeichenfolge jeweils Werte verknüpfen.

Sicherheitshinweis:

Wenn Sie dieses Feature verwenden, gehen Sie mögliche Sicherheitsrisiken ein. Rückrufargumente werden nicht überprüft und sind deshalb als unsicher zu werten. Sie sollten keine Argumente verwenden, ohne vorher deren Inhalt zu prüfen. Ausführliche Informationen finden Sie unter Übersicht über Skriptangriffe.

Siehe auch

Aufgaben

Gewusst wie: Implementieren von Rückrufen in ASP.NET-Webseiten

Konzepte

Programmgesteuertes Implementieren von Clientrückrufen ohne Postbacks in ASP.NET-Webseiten

Clientrückruf und Beispiel für die Implementierung einer Validierung