Спонсор: Microsoft
Опубликован: 14.11.2006 | Доступ: свободный | Студентов: 5820 / 513 | Оценка: 4.18 / 3.74 | Длительность: 16:37:00
ISBN: 978-5-9556-0085-7
Лекция 18:

Элементы управления и использование JavaScript

< Лекция 17 || Лекция 18: 12345

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-сервисами, описывалось в "лекции 16" .

Разница с клиентским обратным вызовом в том, что этот пример отправляет функции обратного вызова параметр.

Это делается в функции JavaScript GetTemp() на странице .aspx:

function GetTemp()
    {
      var City = document.forms[0].DropDownListCity.value;
      UseCallback(City, "");
    }

Функция JavaScript читает значение, выбранное в DropDownListCity, и использует в качестве аргумента функции обратного вызова. Этот пример, как и предыдущий, обновляет страницу не полностью, а только необходимые ее части.

Заключение

В этом курсе мы затронули только часть возможностей ASP .NET 2.0. В последнее время широко пропагандируется технология Ajax и основанная на ней технология Atlas от Microsoft. Объявлено о выходе .NET Framework 3.0. Поэтому и мне, и вам предстоит еще многому научиться.

< Лекция 17 || Лекция 18: 12345
Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319

Александр Шнайдман
Александр Шнайдман
Израиль, Тель Авив