Compartir a través de


Ejemplo de implementación de devolución de llamada de cliente (C#)

Actualización: noviembre 2007

Muestra una página Web ASP.NET que implementa una devolución de llamada del cliente. Para obtener más información, vea Implementar mediante programación devoluciones de llamada de cliente sin devoluciones de datos en páginas web de ASP.NET.

Ejemplo

Descripción

El ejemplo de código siguiente se compone de dos partes. La primera parte muestra una página Web ASP.NET (la página .aspx). La segunda parte muestra el archivo de código subyacente correspondiente (el archivo .aspx.cs).

Código

<%@ 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 >
  <script type="text/javascript">
    function LookUpStock()
    {
        var lb = document.forms[0].ListBox1;
        var product = lb.options[lb.selectedIndex].text 
        CallServer(product, "");
    }
    
    function ReceiveServerData(rValue)
    {
        Results.innerText = rValue;
    }
  </script>
</head>
<body>
  <form id="form1" >
    <div>
      <asp:ListBox ID="ListBox1" Runat="server"></asp:ListBox>
      <br />
      <br />
      <button onclick="LookUpStock()">Look Up Stock</button>
      <br />
      <br />
      Items in stock: <span ID="Results"></span>
      <br />
    </div>
  </form>
</body>
</html>

// ClientCallback.aspx.cs code-behind page
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 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 String RaiseCallbackEvent(String eventArgument)
    {
        String returnValue;
        if (catalog[eventArgument] == null)
        {
            returnValue = "-1";
        }
        else
        {
            returnValue = catalog[eventArgument].ToString();
        }
        return returnValue;
    }
}

Comentarios

La página Web emula una búsqueda de base de datos para determinar el número de elementos disponibles, o en existencias, para una serie de productos (monitores, teclados, etc.). Para simplificar este ejemplo de código, la base de datos está representada por una lista de diccionario que contiene un pequeño grupo de elementos. Para cada elemento de la tabla, la clave es el nombre del elemento (por ejemplo, monitor) y el valor es el número de elementos que hay en existencias. En una aplicación de producción, se utilizaría una base de datos.

Cuando se ejecuta la página, se enlaza un control ListBox a la tabla hash para que el control ListBox muestre la lista de productos. La página también contiene un elemento button (no un control de servidor Web de botón), cuyo evento onclick está enlazado a una función del cliente denominada LookUpStock. Cuando los usuarios hacen clic en el botón, éste ejecuta la función LookUpStock, que obtiene la selección actual del cuadro de lista y, a continuación, realiza la devolución de llamada del cliente llamando a la función CallServer.

La página de código subyacente agrega secuencias de comandos de cliente a la página a través del método RegisterClientScriptBlock. La secuencia de comandos que se agrega a la página incluye una función denominada CallServer, que obtiene el nombre del método que realiza la devolución de datos al servidor desde el método GetCallbackEventReference.

La devolución de llamada del cliente invoca al método RaiseCallbackEvent, que devuelve las existencias disponibles para el producto deseado. Tenga en cuenta que los argumentos enviados entre la secuencia de comandos de cliente y el código del servidor sólo pueden ser cadenas.

Nota de seguridad:

Cuando se utiliza esta característica, la seguridad puede verse amenazada. Los argumentos de la devolución de llamada no se validan y, por consiguiente, deben considerarse no seguros. Debe comprobar siempre el contenido de los argumentos antes de utilizarlos. Para obtener más información, vea Información general sobre los ataques mediante secuencias de comandos.

Vea también

Conceptos

Implementar mediante programación devoluciones de llamada de cliente sin devoluciones de datos en páginas web de ASP.NET