Callback с параметрами
Теперь создадим страницу, которая использует обратный вызов с параметром. Наверху страницу поставим выпадающий список городов, который заполняется из web-сервиса, кнопку и строку ввода только для чтения для результата обратного вызова.
Страница просит выбрать город и вызывает серверный скрипт, чтобы запустить запрос к XML web-сервису на сервере. Web-сервис возвращает прогноз погоды для данной местности в текстовом формате:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Callback.aspx.cs" Inherits="Callback" %>
<!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 runat="server"> <title>Web Service Callback с параметром</title> <script type="text/javascript"> function GetTemp() { var City = document.forms[0].DropDownListCity.value; UseCallback(City, ""); } function GetTempFromServer(TextBox2, context) { document.forms[0].TextBox2.value = "В городе " + document.forms[0].DropDownListCity.value + " температура воздуха " + TextBox2; } </script> </head> <body> <form id="form1" runat="server"> <div> <asp:DropDownList ID="DropDownListCity" runat="server"> </asp:DropDownList> <br /> <input id="Button1" type="button" value="Get Temp" onclick="GetTemp()"/><br /> <asp:TextBox ID="TextBox2" runat="server" Width="634px" BackColor="#FFFFC0" Height="34px" ReadOnly="True"></asp:TextBox></div> </form> </body> </html>
using System; using System.Xml;
public partial class Callback : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler { string _callbackResult; protected void Page_Load(object sender, EventArgs e) { GlobalWeather ws = new GlobalWeather(); string results = ws.GetCitiesByCountry("Russia"); XmlDocument doc = new XmlDocument(); doc.LoadXml(results); XmlNode child = doc.ChildNodes[0]; foreach (XmlElement el in child.ChildNodes) { XmlElement city = el["City"]; DropDownListCity.Items.Add(city.InnerText); } string cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "GetTempFromServer", "context"); string cbScript = "function UseCallback(arg, context)" + "{" + cbReference + ";" + "}"; Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "UseCallback", cbScript, true); } public void RaiseCallbackEvent(string eventArg) { GlobalWeather ws = new GlobalWeather(); _callbackResult = ws.GetWeather(eventArg, "Russia").ToString(); XmlDocument doc = new XmlDocument(); doc.LoadXml(_callbackResult); XmlNode child = doc.ChildNodes.Item(1); XmlElement el = child["Temperature"]; _callbackResult = el.InnerText; } public string GetCallbackResult() { return _callbackResult; } }
Для работы этого примера нужно создать web-ссылку на сервис "http://www.webservicex.net/globalweather.asmx". Как работать с web-сервисами, описывалось в лекции 15.
Разница с клиентским обратным вызовом в том, что этот пример отправляет функции обратного вызова параметр.
Это делается в функции JavaScript GetTemp() на странице .aspx:
function GetTemp() { var City = document.forms[0].DropDownListCity.value; UseCallback(City, ""); }
Функция JavaScript читает значение, выбранное в DropDownListCity, и использует в качестве аргумента функции обратного вызова. Этот пример, как и предыдущий, обновляет страницу не полностью, а только необходимые ее части.