Condividi tramite


Esempio di implementazione di callback client (C#)

Aggiornamento: novembre 2007

Nell'esempio viene illustrata una pagina Web ASP.NET che implementa un callback client. Per ulteriori informazioni, vedere Implementazione di callback client a livello di codice senza postback nelle pagine Web ASP.NET.

Esempio

Descrizione

L'esempio di codice riportato di seguito si suddivide in due parti. Nella prima parte dell'esempio viene illustrata una pagina Web ASP.NET (la pagina ASPX). Nella seconda parte viene illustrato il file code-behind corrispondente (file ASPX.CS).

Codice

<%@ 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;
    }
}

Commenti

La pagina Web emula una ricerca nel database per determinare il numero di elementi disponibili, o presenti in magazzino, per una serie di prodotti (monitor, tastiere e così via). Per semplificare questo esempio di codice, il database è rappresentato da un elenco dizionario che contiene un piccolo gruppo di elementi. Per ciascun elemento nella tabella, la chiave indica il nome dell'elemento (ad esempio, monitor), mentre il valore indica il numero di elementi presenti in magazzino. In un'applicazione di produzione, verrebbe invece utilizzato un database.

Durante l'esecuzione della pagina, il controllo ListBox è associato alla tabella hash in modo che il controllo ListBox possa visualizzare l'elenco di prodotti. La pagina contiene inoltre un elemento button (non un controllo server Web Button) il cui evento onclick è associato a una funzione client denominata LookUpStock. Quando l'utente fa clic su questo pulsante, viene eseguita la funzione LookUpStock che ottiene la selezione corrente dalla casella di riepilogo ed esegue il callback client chiamando la funzione CallServer.

La pagina di code-behind aggiunge uno script sul lato client alla pagina mediante il metodo RegisterClientScriptBlock. Lo script che viene aggiunto alla pagina comprende una funzione denominata CallServer che ottiene il nome del metodo che eseguirà il postback al server dal metodo GetCallbackEventReference.

Il callback client richiama il metodo RaiseCallbackEvent che determina la disponibilità in magazzino del prodotto richiesto. Il metodo GetCallbackResult restituisce il valore. Si noti che lo script client e il codice lato server possono scambiare argomenti solo come stringhe. Per passare o ricevere più valori è possibile concatenare valori nella stringa di input o restituita, rispettivamente.

Nota sulla sicurezza:

Quando viene utilizzata questa funzionalità, è necessario tenere in considerazione le potenziali minacce alla sicurezza. Gli argomenti di callback non vengono convalidati e devono pertanto essere considerati non affidabili. È sempre necessario verificare i contenuti degli argomenti prima di utilizzarli. Per ulteriori informazioni, vedere Cenni preliminari sugli attacchi tramite script.

Vedere anche

Attività

Procedura: implementare callback in pagine Web ASP.NET

Concetti

Implementazione di callback client a livello di codice senza postback nelle pagine Web ASP.NET

Esempio di callback client con implementazione di convalida