Статьи

Використання механізму зворотних викликів в ASP.Net 2.0

  1. Параграф 1. Використання прямого виклику функції WebForm_DoCallback
  2. Параграф 2. Використання виклику WebForm_DoCallback функцією скрипта, зареєстрованої на сервері
  3. Параграф 3. Виклик функції WebForm_DoCallback через перевизначення подій серверного контрола
  4. Еcли Ви прийшли з пошукових машин - відвідайте мою головну сторінку

До початку розділу

Новим в ASP.NET 2.0 є використання клієнтського диспетчера зворотних викликів. Це дозволяє виконати часткове оновлення сторінки (в ASP.NET 1 для будь-якого оновлення був потрібний повторний виклик форми). Зворотні виклики асинхронні і виконуються з використанням XML-HTTP (браузер повинен підтримувати протокол XML-HTTP - Internet Explorer версії 5.0 або вище).

Суть виконання зворотних викликів полягає в тому, що на стороні сервера, до події PreRender, сторінка обробляється як завжди, потім обробка припиняється, і сторінка клієнтові не повертаються. Замість повернення сторінки, кліет отримує строкову змінну. Обробку строкової змінної виконує скрипт, ім'я якого стає відомим на серверній стороні. Обробник події зворотного виклику на серверній стороні, також приймає від клієнта деяку інформацію і, таким чином, виконується взаємообмін інформацією між клієнтом і сервером без повторного виклику сторінок.

Крім того, серверу від клієнта можуть бути передані дві рядкові змінні, одна з яких context. За допомогою context можна, наприклад, визначати, який з кількох контролів, що використовують одну і ту ж callback-функціональність, викликав callback.

Таким чином, для реалізації механізму поновлення даних без перезавантаження сторінки необхідно створити функцію реалізації зворотного виклику на стороні клієнта, приймаючу передані з сервера параметри, серверну функцію, приймаючу параметри від клієнта і повертає клієнту значення на підставі отриманих параметрів і зв'язати ці дві функції. Для цього інтерфейс ICallbackEventHandler має два методи: RaiseCallbackEvent, для отримання параметрів на сервері і GetCallbackResult для повернення результату клієнтові. Можливі способи використання зворотних викликів залежать тільки від методів зв'язування функцій клієнта і сервера. Причому, всі вони пов'язані з викликом вбудованої функції JavaScript інтерфейсу ICallbackEventHandler - WebForm_DoCallback.

Функція WebForm_DoCallback має такі аргументи:

WebForm_DoCallback (pageID, // ID сторінки, яка виконує виклик argumrnt, // рядок, що передається сервера returnCollback, // код JavaScript, ініціалізіруемих до завершення // зворотного виклику context, // дані, що передаються викликом ReturnCallback errorCalback); // код JavaScript, ініціалізіруемих при збоях

Розглянемо деякі можливі способи організації зворотних викликів:


На початок

Параграф 1. Використання прямого виклику функції WebForm_DoCallback

Створимо новий проект і помісти на форму два контрола button (НЕ серверний) і Label (Серверний). І напишемо JavaScripp з двома методами - запиту за інформацією на сервер - GetServerInformation і отримання інформації - TikeInformation.

<% @ Page Language = "C #" AutoEventWireup = "true" CodeFile = "Default.aspx.cs" Inherits = "_ Default"%> <! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title> приклад 1 </ title> <script language = "javascript"> function GetServerInformation () {var message = 'X'; var context = ''; // викликаємо WebForm_DoCallback <% = sCallBack%>} function TikeInformation (infstring, context) {alert ( 'Послідовність кроків після натискання кнопки: \ n' + infstring); } </ Script> </ head> <body> <form id = "MainForm" runat = "server"> <asp: Label ID = "Label1" runat = "server" Text = "При завантаження сторінки"> </ asp : Label> <br> <input type = "button" value = "Послідовність кроків під час зворотного виклику:" onclick = "GetServerInformation ();" /> </ Form> </ body> </ html>

Серверний код містить сторінку, що реалізує інтерфейс ICallbackEventHandler, і два методи: RaiseCallbackEvent і GetCallbackResult. Крім того, при завантаженні сторінки готується організація зв'язку Сallback шляхом формування коду для виклику функції WebForm_DoCallback. Виклик цієї функції активізує виклик методів RaiseCallbackEvent і GetCallbackResult і визначає зв'язок GetCallbackResult з функцією TikeInformation скрипта, що виконується на стороні клієнта. Активізація зв'язку виконана на стороні клієнта (звернення до рядка sCallBack з HTML коду).

using System; using System.Web.UI; public partial class _Default: Page, ICallbackEventHandler {public string sCallBack = string.Empty; public string sCallBack1 = string.Empty; void Page_Load (object sender, System.EventArgs e) {// Організуємо зв'язок Сallback зі скриптом TikeInformation, але не активізуємо // при первинному завантаженні сторінки. sCallBack матиме значення // WebForm_DoCallback ( '__ Page', message, TikeInformation, context, null, false) sCallBack = Page.ClientScript.GetCallbackEventReference (this, "message", "TikeInformation", "context"); if (! IsPostBack) {// Переглянемо Label1.Text + = "<br> <br> Крок 1:" + sCallBack + "<br>"; sCallBack1 + = "1 \ n"; } Else {Label1.Text + = "" + sCallBack; sCallBack1 + = "2Page_Load () \ n"; }} // Обробник події зворотного виклику на серверній стороні void ICallbackEventHandler.RaiseCallbackEvent (string e) {sCallBack1 + = "3 RaiseCallbackEvent і витяг переданої інформації, яка зараз =" + e + "\ n"; } // Видача результату string ICallbackEventHandler.GetCallbackResult () {sCallBack1 + = "4 GetCallbackResult () Видача результату"; return sCallBack1; }}

Метод GetCallbackEventReference визначено як:

public string GetCallbackEventReference (string target, // сторінка, виклику string argument, // строкова змінна, для передачі сервера string clientCallback, // код JavaScript, ініціалізіруемих по завершенні // і приймає строкову змінну з серверавизова string context, // дані, що передаються викликом ReturnCallback string clientErrorCallback // код JavaScript, ініціалізіруемих при збоях)

Результат роботи коду показаний на Рис.1.

Рис.1 Прямий виклик події WebForm_DoCallback

Відображена послідовність кроків, показує, що метод Page_Load викликається і під час зворотного виклику, але відображення результатів на сторінці клієнта не виконується (ми вже говорили, що до події PreRender, сторінка обробляється як завжди, потім обробка припиняється, і сторінка клієнтові не повертаються).


На початок

Параграф 2. Використання виклику WebForm_DoCallback функцією скрипта, зареєстрованої на сервері

В даному прикладі розглядається виклик все тієї ж функції WebForm_DoCallback, але тільки через скрипт CallDataServer, який при завантаженні сторінки, реєструється на сервері як клієнтський скрипт.

Створимо новий проект, і помісти на форму два контрола select (НЕ серверний) і Label (Серверний), і поле для виведення HTML коду span. І напишемо JavaScripp з двома методами - запиту за інформацією на сервер - GetServerInformation і отримання інформації - TikeInformation.

<% @ Page Language = "C #" AutoEventWireup = "true" CodeFile = "Default.aspx.cs" Inherits = "_ Default"%> <html> <head> <title> Приклад 2 </ title> <script type = " text / javascript "> function GetServerInformation () {var element = document.getElementById (" Select1 "); var opt = element.options [element.selectedIndex] .text; // Викликаємо зарегістрованний скрипт CallDataServer (opt, ''); } Function TikeInformation (infstring) {output.innerHTML = infstring; } </ Script> </ head> <body> <form id = "form1" runat = "server"> <asp: Label ID = "Label1" runat = "server" Text = "Label"> </ asp: Label > <br /> <br> <div> <select id = "Select1"> <option value = 1 selected = "selected"> Опція_ 1 </ option> <option value = 2> Опція_ 2 </ option> </ select> <br /> <br /> <input onclick = "GetServerInformation ()" value = "Отримати" type = button> <br /> <span ID = "output"> </ span> <br /> </ div> </ form> </ body> </ html>

Серверний код містить сторінку, що реалізує інтерфейс ICallbackEventHandler і два методи: RaiseCallbackEvent і GetCallbackResult. Крім того, при завантаженні сторінки, організуємо зв'язок Сallback через реєстрацію на стороні сервера функції CallDataServer кліенсткого скрипта. У даній функції виконується звернення до функції WebForm_DoCallback. Виклик функції, в свою чергу, активізує RaiseCallbackEvent і GetCallbackResult і визначає зв'язок GetCallbackResult з функцією TikeInformation скрипта, що виконується на стороні клієнта.

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 _Default: System.Web.UI.Page, System.Web.UI.ICallbackEventHandler {string sCallBack1 = string.Empty; protected void Page_Load (object sender, EventArgs e) {Label1.Text = ""; string callbackScript = string.Empty; if (! IsPostBack) {callbackScript = "function CallDataServer (message, context)" + "{" + Page.ClientScript.GetCallbackEventReference (this, "message", "TikeInformation", "context") + "};"; Label1.Text + = "<br> Крок 1:" + callbackScript + "<br>"; //Label1.Text + = "<br> Крок 1:" + callbackScript + "<br>"; // Реєструємо клієнтський скрипт на сервері Page.ClientScript.RegisterStartupScript (this.GetType (), "aaaaaa", callbackScript, true); sCallBack1 + = "Крок 1 \ n"; } Else {Label1.Text + = "" + callbackScript; sCallBack1 + = "Крок 2 Page_Load () \ n"; }} Void ICallbackEventHandler.RaiseCallbackEvent (string e) {sCallBack1 + = "Крок 3 RaiseCallbackEvent () і отримання інформації клієнта: <font color = red>" + e.ToString (); } // Видача результату string ICallbackEventHandler.GetCallbackResult () {sCallBack1 + = "</ font> Крок 4 GetCallbackResult () Видача результату"; return sCallBack1; }}

Результат роботи коду показаний на Рис.2.

Рис.2 Виклик функції WebForm_DoCallback через зареєстрований на сервері скрипт


На початок

Параграф 3. Виклик функції WebForm_DoCallback через перевизначення подій серверного контрола

Даний приклад використовує вже серверні елементи. Скрипт виклику функції WebForm_DoCallback безпосередньо пов'язується з подією серверного елемента управління. Для того, щоб серверні контроли не викликали перевантаження сторінки, після виклику функції доданий код return false. В іншому, логіка і послідовність кроків, відповідає вищеописаним прикладів.

<% @ Page Language = "C #" AutoEventWireup = "true" CodeFile = "Default.aspx.cs" Inherits = "_ Default"%> <script type = "text / javascript"> function TikeInformation (infstring) {document.getElementById ( "div1"). innerHTML = infstring; } Function TikeInformation1 (infstring) {document.getElementById ( "div2"). InnerHTML = infstring; } </ Script> <html> <head> <title> Приклад 3 </ title> </ head> <body> <form id = "form1" runat = "server"> <br> <asp: Label ID = " Label1 "runat =" server "Text =" Label "> </ asp: Label> <br> <div> <select id =" Select1 "> <option selected =" selected "value = 1> Опція 1 </ option> <option value = 2> Опція 2 </ option> </ select> <asp: Button ID = "Button1" runat = "server" Text = "Отримати" /> <br> <asp: TextBox ID = "TextBox1" runat = "server" Height = "28px" Width = "164px"> </ asp: TextBox> </ div> <br> <div id = "div1"> </ div> <br> <div id = "div2" > </ div> </ form> </ body> </ html>

У серверному коді відмінність лише в зв'язуванні події WebForm_DoCallback з подією елемента управління.

using System; using System.Data; using System.Configuration; 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 _Default: System.Web.UI.Page, System.Web.UI.ICallbackEventHandler {string sCallBack1 = string.Empty; string sS = string.Empty; protected void Page_Load (object sender, EventArgs e) {if (! IsPostBack) {sS = Page.ClientScript.GetCallbackEventReference (this, "document.getElementById ( 'Select1'). options [document.getElementById ( 'Select1'). selectedIndex] .text "," TikeInformation ", null); Label1.Text = sS; Button1.Attributes.Add ( "onclick", sS + "; return false;"); sS = Page.ClientScript.GetCallbackEventReference (this, "document.getElementById ( 'TextBox1'). value", "TikeInformation1", null); TextBox1.Attributes.Add ( "onkeyup", sS + "; return false;"); Label1.Text + = "" + sS; color = darkred>}} void ICallbackEventHandler.RaiseCallbackEvent (string e) {sCallBack1 + = e.ToString (); } // Видача результату string ICallbackEventHandler.GetCallbackResult () {return sCallBack1; }}

Результат роботи коду показаний на рис.3.

Рис.3 Виклик функції WebForm_DoCallback через перевизначення подій серверного контрола

Молчанов Владислав 17.3.2006г.

Еcли Ви прийшли з пошукових машин - відвідайте мою головну сторінку

На головній сторінці Ви знайдете програми комплексу Veles - для тих хто готується до іспитів на право керування автомобілем або мотоциклом, програму NumberPhoto, створену для роботи з фото, зробленими цифровим фотоапаратом, програму Bricks - іграшку для дітей і дорослих, програму записну книжку, теоретичний матеріал з програмування в середовищі Borland C ++ builder, C # (C .Net).
На початок сторінки

До початку розділу

На початок книги

Новости