Поделиться через


Пример реализации обратного вызова клиента (C#)

Обновлен: Ноябрь 2007

Демонстрирует веб-страницу ASP.NET, которая реализует обратный вызов клиента. Дополнительные сведения см. в разделе Программная реализация обратных вызовов клиента без обратной передачи в веб-страницы ASP.NET.

Пример

Описание

Следующий пример кода состоит из двух частей. В первой части примера показана веб-страница ASP.NET (страница .aspx). Вторая часть показывает соответствующий файл с выделенным кодом (.aspx.cs файл).

Код

<%@ 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" runat="server">
  <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" runat="server">
    <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" runat="server"></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;
    }
}

Примечания

Веб-страница эмулирует уточняющий запрос базы данных для определения номеров товаров, которые являются доступными, или на складе, для ряда продуктов (мониторов, клавиатур и т. д.). Чтобы упростить данный пример, база данных представляется словарным списком, содержащим небольшой набор элементов. Для каждого товара в таблице ключом является имя элемента (например монитор) а значением — число элементов, находящихся в складе. В реальных приложениях вместо этого используется база данных.

При запуске страницы элемент управления ListBox привязывается к хэш-таблице таким образом, чтобы элемент управления ListBox отображал список продуктов. Страница также содержит элемент button (не веб-серверный элемент управления Button), событие onclick которого привязано к клиентской функции с именем LookUpStock. При нажатии кнопки, кнопка вызывает функцию LookUpStock, которая получает текущее выделение в раскрывающемся списке и выполняет обратный вызов клиента с помощью вызова функции CallServer.

Страница фонового кода добавляет клиентский сценарий на страницу с помощью метода RegisterClientScriptBlock. Сценарий, который добавляется на страницу, включает функцию с именем CallServer, которая получает имя метода, который сделает обратный вызов на сервер из метода GetCallbackEventReference.

Обратный вызов клиента вызывает метод RaiseCallbackEvent, который определяет доступность на складе для переданного ему продукта. Метод GetCallbackResult возвращает значение. Обратите внимание, что аргументы, передаваемые между клиентским сценарием и серверном кодом, могут быть только строками. Чтобы передать или получить несколько значений, можно объединять значения входной или выходной строки соответственно.

ms178210.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

При использовании этого средства существуют потенциальные угрозы безопасности. Аргументы ответного вызова не проверяются и, таким образом, должны рассматриваться, как небезопасные. Всегда следует выполнять проверку содержимого аргументов перед их использованием. Дополнительные сведения см. в разделе Общие сведения об использовании сценариев.

См. также

Задачи

Практическое руководство. Реализация обратных вызовов на веб-страницах ASP.NET

Основные понятия

Программная реализация обратных вызовов клиента без обратной передачи в веб-страницы ASP.NET

Обратный вызов от клиента с примером реализации проверки