Первый пример ASP.NET AJAX: Hello User

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

В VWD создайте новый проект веб?сайта из шаблона ASP.NET AJAX. Затем в корневом каталоге веб?сайта создайте новую веб?службу (с помощью файла?шаблона веб?службы) с именем WebService.asmx. В файле .asmx реализуйте простой веб?метод, который принимает единственный строковый параметр, скопировав в файл программный код из примера 1.1. Обратите внимание на обязательный атрибут

, который фактически определяется платформой ASP.NET AJAX (в пространстве имен System.Web.Script.Services).

Пример 1.1. Веб-служба

[VBNET]WebService.asmx
<%@ WebService Language="C#" Class="WebService" %>
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
[WebService(Namespace = "http://hauser?wenz.de/AspNetAJAX/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {
    [WebMethod]
    public string sayHello(string name) {
    return "Hello " + name + ", says the server!";
    }
}


Теперь попробуйте обратиться к этой веб-службе из веб-броузера, добавив символы /js в конец адреса URL. При обращении по такому URL возвращается программный код JavaScript, который фактически представляет собой реализацию класса?посредника JavaScript. Самое важное здесь заключается в том, что этот программный код создает переменную WebService, которая обеспечивает взаимодействие с веб-службой.

Можно заметить, что шаблон ASP.NET AJAX уже создал файл Default.aspx, содержимое которого мы рассмотрим ниже. Следующий фрагмент – это текст, содержащийся в данном файле:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="_Default" %>
<!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 runat="server"><title>Untitled Page</title>
</head>
(body)
    <form id="form1" runat="server">
        
        <div>
        </div>
    </form>
(/body)
</html>

Первое, на что следует обратить внимание, – это новый элемент управления: . Этот элемент управления является основой любой веб?страницы с поддержкой ASP.NET AJAX.

Откройте файл Default.aspx в текстовом редакторе и добавьте в элемент ScriptManager ссылку на веб?службу, как показано ниже. При запуске страницы благодаря этой ссылке будет сгенерирован объект-посредник JavaScript, с помощью которого страница будет способна использовать программный код, динамически сгенерированный программным кодом веб-службы:

(asp:ScriptManager ID="ScriptManager1" runat="server")
  <Services
    
  </Services>
(/asp:ScriptManager)


Теперь необходимо вставить в страницу несколько HTML-элементов. Добавьте текстовое поле ввода и кнопку в существующий элемент <form> (внутри элемента <div>, если вы собираетесь придерживаться требований стандарта XHTML):

<input type="text" id="name" name="name" />
<input type="button" value="Call Service" onclick="callService(this.form);" />


Обработчик события кнопки вызывает функцию JavaScript с именем callService() и передает ей ссылку на текущую форму. Метод callService() – это та самая точка в сценарии, где происходит обращение к веб?службе. Чтобы вызвать метод веб?службы sayHello(), сценарий
должен воспользоваться объектом?посредником, который доступен через автоматически созданную переменную с именем WebService. (Имя WebService соответствует имени класса веб?службы, созданного ранее.)

Метод sayHello() ожидает получить не только строку, но и три ссылки на функции?обработчики: первая вызывается в случае успешного исполнения веб?службы (callComplete), вторая при появлении ошибки (callError) и третья по истечении предельного времени ожидания ответа (в данном примере мы используем только первые две функции).

Затем поместите следующий программный код в клиентский элемент <script> на странице:

function callService(f) {
  WebService.sayHello(
    f.elements["name"].value,
    callComplete,
    callError);
}


В заключение необходимо написать две функции, которые будут обрабатывать события callComplete и callError. Для этого добавьте следующий фрагмент в клиентский блок сценария, который только что был создан:

function callComplete(result) {
  window.alert(result);
}
function callError(result) {
  window.alert("Error! " + result);
}


В примере 1.2 приводится содержимое файла Default.aspx целиком.
Пример 1.2. Простая страница ASP.NET AJAX, которая обращается
к веб-службе

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="_Default" %>
<!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 runat="server">
<title>ASP.NET AJAX</title>
  <script language="Javascript" type="text/javascript">
  function callService(f) {
    WebService.sayHello(
      f.elements["name"].value,
      callComplete,
      callError);
  }
  function callComplete(result) {
    window.alert(result);
  }
  function callError(result) {
    window.alert("Error! " + result);
  }
  </script>
</head>
(body)
  <form id="form1" runat="server">
           ID="ScriptManager1"
      runat="server">
      <Services>
        
      </Services>
    
    <div>
      <input type="text" id="name" name="name" />
      <input type="button" value="Call Service" 
             onclick="callService(this.form);" />
    </div>
  </form>
(/body)
</html>

Запустите приложение (клавишей F5 или Ctrl+F5 в VWD). В окне броузера можно увидеть вполне предсказуемый результат, причем не только в Internet Explorer, но и в любом другом броузере, отвечающем нашим требованиям. Щелкните на кнопке несколько раз и убедитесь,
что обновления страницы не происходит, хотя страница выполняет обмен данными с веб?службой на стороне сервера.

Добавлено: 24 Июля 2018 07:59:30 Добавил: Андрей Ковальчук

Пакеты ASP.NET AJAX

На домашней странице проекта ASP.NET AJAX (http://ajax.asp.net/) представлен перечень пакетов, каждый из которых предназначен для решения определенных задач:

ASP.NET AJAX Extensions
Известен также под названием «ASP.NET AJAX Core». Это «главный» пакет ASP.NET AJAX. Он целиком поддерживается компанией Microsoft и содержит инфраструктуру ASP.NET AJAX.

ASP.NET AJAX Control Toolkit
Этот пакет содержит обширную коллекцию серверных компонентов, предоставляющих легкий и удобный доступ к потрясающим функциональным возможностям Ajax. Пакет Control Toolkit – проект с открытыми исходными текстами, хотя компания Microsoft и остается руководителем проекта, что гарантирует его высокое качество. Тем не менее официально Microsoft не осуществляет поддержку элементов пакета.

ASP.NET AJAX Futures Release
Этот пакет содержит экспериментальные реализации функциональных возможностей, которые могут войти (или не войти) в состав ASP.NET и ASP.NET AJAX. Кроме того, в пакет Futures Release помещаются редко используемые элементы, которые первоначально входили в состав предварительных версий ASP.NET AJAX. Версия CTP (Community Technology Preview – предварительная версия, доступная для загрузки) обновляется чаще, чем основной пакет. Но эта версия пакета официально не поддерживается, поэтому вы можете использовать его только на свой страх и риск.Кроме того, в мае 2007 года ASP.NET AJAX Futures CTP входил в состав пакета ASP.NET Futures CTP, который включает в себя новые интересные (и не поддерживаемые) возможности для работы с классической версией ASP.NET.

Microsoft Ajax Library
Упоминавшаяся ранее библиотека JavaScript.

Добавлено: 24 Июля 2018 07:57:53 Добавил: Андрей Ковальчук

ASP.NET AJAX и Ajax

Платформа ASP.NET AJAX расширяет набор технологий, поддерживаемых броузером, включая асинхронный JavaScript и XML (Asynchronous JavaScript and XML – Ajax). Технология Ajax произвела довольно много шума в последнее время (в предисловии приводятся некоторые соображения по этому поводу), поскольку она позволяет приблизить веб?приложения по функциональности и пользовательскому интерфейсу к обычным настольным приложениям.

Главная концепция, которая лежит в основе Ajax, заключается в том, чтобы дать веб?страницам возможность производить HTTP-запросы в фоновом режиме, или асинхронно, без необходимости обновлять содержимое страницы целиком (или, в терминологии ASP.NET, без отправки заполненной формы и получения в ответ новой страницы).

Кроме того, применение технологий Ajax позволяет создавать более отзывчивый пользовательский интерфейс с привлечением всей мощи функциональных возможностей, поддерживаемых броузером, таких как JavaScript, объектная модель документа (Document Object Model – DOM) и каскадные таблицы стилей (Cascading Style Sheets – CSS). Приложение Google Suggest (http://www.google.com/webhp?complete=1&hl=en) наглядно демонстрирует, как страница с поддержкой Ajax может предоставлять пользователю подсказки по мере ввода текста (этот прием известен также как автодополнение). Еще один пример подобных приложений – Microsoft Virtual Earth (http://www.virtualearth.com/).

Платформа ASP.NET AJAX поможет вам в создании подобных приложений, обладающих поддержкой Ajax, исполняющихся броузером (клиентом). Для работы с технологиями Ajax и ASP.NET AJAX на стороне клиента вам потребуется четкое понимание базовых технологий Ajax. Для создания веб?страниц с поддержкой Ajax, в которых используются сценарии, исполняемые броузером, необходимо знание и понимание языка программирования JavaScript, DOM и объекта XMLHttpRequest, который выполняет запросы от клиента к серверу. Знание языка разметки XML и языка описания преобразований XSLT желательно, но не обязательно. (В книге они подробно не рассматриваются.)

В главе 3 более подробно обсуждаются прочие технологии Ajax. Для понимания примера, который приводится в конце этой главы (раздел «Первый пример ASP.NET AJAX: Hello User»), достаточно обладать базовыми представлениями о технологии Ajax. Ваши знания будут углубляться по мере продвижения вперед.

Создание приложений на основе технологии Ajax без использования какой?либо оболочки, такой как ASP.NET AJAX, может оказаться делом достаточно сложным. В какой?то момент вы вдруг обнаружите, что вам снова и снова приходится писать один и тот же программный
код, выполняющий такие действия, как отображение данных, полученных от сервера по запросу, привязка данных к элементам управления или взаимодействие с веб?службами. Вам также придется столкнуться с необходимостью писать код, который учитывал бы различия
реализации DOM в разных броузерах. Одна из целей, которые преследует ASP.NET AJAX, состоит в том, чтобы уменьшить или вообще ликвидировать необходимость написания избыточного программного кода и предоставить в распоряжение разработчика, занимающегося разработкой клиентских приложений, весь опыт, накопленный разработчиками платформы ASP.NET 2.0. Еще одна цель состоит в том, чтобы усилить JavaScript некоторыми преимуществами, которые дают объектно?ориентированное программирование (ООП) и использование таких платформ, как .NET. Платформа ASP.NET AJAX включает в себя библиотеки клиентских сценариев, которые дают программисту JavaScript/DOM/CSS следующие преимущества:

Совместимость с разными типами броузеров
Обеспечивает возможность исполнения сценариев ASP.NET AJAX в большинстве броузеров и ликвидирует необходимость создаватьвручную сценарии для каждого броузера, поддерживаемого приложением.

Основные службы
Предоставляют расширения JavaScript, которые позволяют использовать объектно?ориентированный стиль программирования, включая поддержку классов, пространств имен, обработку событий, наследование и сериализацию (serialization) объектов с учетом форматов JSON (JavaScript Object Notation – формат представления объектов JavaScript) и XML.

Библиотека базовых классов
Эта библиотека содержит ряд .NET?подобных компонентов, таких как построители строк и таймеры.

Сценарные компоненты и элементы управления
Представляют собой версии ASP.NET AJAX стандартных элементов управления HTML, которые дополнены такими возможностями, как привязка данных, предопределенное поведение (например, поддержка функциональности «перетащит-и-отпустить») и тесная интеграция с клиентскими библиотеками ASP.NET AJAX. Вы можете использовать эти элементы управления и компоненты непосредственно или воспользоваться новой декларативной разметкой, получившей название xml?script, которая будет рассматриваться в нескольких главах этой книги. Если вы уже знакомы с синтаксисом разметки ASP.NET, значит, вы понимаете (в общих чертах) взаимосвязь между элементами управления HTML, абстрактными программируемыми версиями этих элементов управления и декларативным синтаксисом.

Добавлено: 24 Июля 2018 07:56:48 Добавил: Андрей Ковальчук

Наследование классов

Ограниченная поддержка механизма наследования классов в JavaScript обеспечивается с помощью свойства prototype. Платформа ASP.NET AJAX обеспечивает дополнительный уровень абстракции. Механизм prototype поддерживается и для классов пространств имен, которые регистрируются с помощью метода ClassName.registerClass(). Во втором аргументе этого метода можно указать базовый класс. То есть можно задать, от какого класса порожден текущий класс.

Производные классы
Давайте попробуем создать класс, производный от класса Software. Броузеры являются одной из разновидностей программного обеспечения, поэтому создадим класс Browser. В дополнение к свойствам порождающего класса Software, броузеры должны обладать некоторыми дополнительными свойствами. Свойство isJavaScriptSupported может давать информацию о том, поддерживает ли данный броузер возможность исполнять сценарии на языке JavaScript.

OReilly.Browser = function(name, vendor, isJavaScriptSupported) {
  //...
}


Ниже демонстрируется порядок регистрации класса. Обратите внимание на то, как новый класс (строковый параметр) наследует класс OReilly.Software (это уже не строка!).
OReilly.Browser.registerClass("OReilly.Browser", OReilly.Software);


Разумеется, можно было бы снова создать методы для доступа к свойствам name и vendor и написать программный код конструктора. Но одно из преимуществ наследования (фактически, главное преимущество) состоит в том, что существует возможность повторного использования функциональности базового класса. Поскольку OReilly.Browser является наследником OReilly.Software, можно использовать уже имеющиеся методы получения и задания значений (то есть сами свойства), а также «частные» члены _name и _vendor. Нам только потребуется добавить методы доступа и частные члены для нового свойства isJavaScriptSup-ported, как показано ниже:

var _isJavaScriptSupported = (isJavaScriptSupported != null) ?
  isJavaScriptSupported : false;
this.getIsJavaScriptSupported = function() {
  return _isJavaScriptSupported;
}
this.setIsJavaScriptSupported = function(isJavaScriptSupported) {
  _isJavaScriptSupported = isJavaScriptSupported;
}


Теперь все, что осталось сделать, – это написать конструктор. Но вместо того, чтобы снова писать его с самого начала, можно воспользоваться конструктором базового класса. Для этой цели ASP.NET AJAX предоставляет метод initializeBase(). В первом параметре этому мето ду передается экземпляр класса, для которого должен быть вызван конструктор базового класса – как правило, используется значение this. Второй параметр – это массив аргументов для передачи конструктору базового класса (набор аргументов определяется базовым конструктором). В нашем случае этот массив будет содержать название броузера и производителя.

OReilly.Browser.initializeBase(this, new Array(name, vendor));


В примере 4.2 приводится программный код, который создает и использует новый производный класс Browser.
Пример 4.2. Использование механизма наследования ASP.NET AJAX ClientInheritance.aspx

<%@ Page Language="C#" %>
<!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 id="Head1" runat="server">
  <title>ASP.NET AJAX</title>
  <script language="Javascript" type="text/javascript">
  function pageLoad() {
    var s = "";
    Type.registerNamespace("OReilly");
    OReilly.Software = function(name, vendor) {
      var _name = (name != null) ? name : "unknown";
      var _vendor = (vendor != null) ? vendor : "unknown";
      this.getName = function() {
        return _name;
      }
      this.setName = function(name) {
        _name = name;
      }
      this.getVendor = function() {
  return _vendor;
      }
      this.setVendor = function(vendor) {
        _vendor = vendor;
      }
    }
    Type.registerClass("OReilly.Software");
    OReilly.Browser = function(name, vendor, isJavaScriptSupported) {
      OReilly.Browser.initializeBase(this, new Array(name, vendor));
        var _isJavaScriptSupported = (isJavaScriptSupported != null) ?
          isJavaScriptSupported : false;
        this.getIsJavaScriptSupported = function() {
        return _isJavaScriptSupported;
      }
      this.setIsJavaScriptSupported = function(isJavaScriptSupported) {
        _isJavaScriptSupported = isJavaScriptSupported;
      }
    }
    OReilly.Browser.registerClass("OReilly.Browser", OReilly.Software);
    var ie = new OReilly.Browser("Internet Explorer", "Microsoft", true);
    s = ie.getName() + " from " + ie.getVendor() +
      (ie.getIsJavaScriptSupported() ? " (w/ JS)" : " (w/o JS)") +
      "
";
    var lynx = new OReilly.Browser("Lynx");
    lynx.setIsJavaScriptSupported(false);
    s += lynx.getName() + " from " + lynx.getVendor() +
      (lynx.getIsJavaScriptSupported() ? " (w/ JS)" : " (w/o JS)");
    document.getElementById("output").innerHTML = s;
  }
  </script>
</head>
(body)
  <form id="form1" runat="server">
    
    
    <div id="output">
    </div>
  </form>
(/body)
</html>


Доступ к методам базового класса
Когда речь заходит о наследовании классов, сам собой напрашивается вопрос – возможно ли перекрыть родительские методы в производном классе. Ответ на этот вопрос – да. Следующий вопрос: существует ли возможность обратиться к аналогичным методам базового класса (то есть к перекрытым методам)? И снова ответ – да, платформа ASP.NET
AJAX позволяет делать это. Для демонстрации этих возможностей добавим в класс OReilly.Software метод toString(), который будет выводить названия продукта и производителя, хранящиеся в классе. Свойство prototype обеспечивает работу механизма наследования; оно же позволяет обращаться к методам базового класса.

OReilly.Software.prototype.toString = function() {
  return this.getName() + " from " + this.getVendor();
}


В классе OReilly.Browser можно было бы реализовать похожий метод toString():
OReilly.Browser.prototype.toString = function() {
  return this.getName() + " from " + this.getVendor() +
    (this.getIsJavaScriptSupported() ? " (w/ JS)" : " (w/o JS)");
}


Однако снова было бы желательно повторно использовать имеющийся программный код, в данном случае – метод toString() базового класса.

Платформа ASP.NET AJAX предоставляет вспомогательный метод callBaseMethod(), который вызывает метод родительского класса. Этот метод принимает три аргумента:
instance
Экземпляр класса, для которого должен быть вызван метод базового класса (обычно значение this)
methodName
Имя метода (в виде строки)
baseArguments
Аргументы метода, если таковые имеются (в виде массива)

В данном случае метод toString() класса OReilly.Browser может быть реализован следующим образом:
OReilly.Browser.prototype.toString = function() {
  return OReilly.Browser.callBaseMethod(this, "toString") +
    (this.getIsJavaScriptSupported() ? " (w/ JS)" : " (w/o JS)");
}


Теперь можно сократить фрагмент сценария, который выводит информацию о броузерах, как показано ниже:

var s = "";
var ie = new OReilly.Browser("Internet Explorer", "Microsoft", true);
s = ie.toString() + "
";
var lynx = new OReilly.Browser("Lynx", null, false);
s += lynx.toString();
document.getElementById("output").innerHTML = s;

В примере 4.3 приводится полный листинг.
Пример 4.3. Доступ к методам базового класса
ClientBaseMethods.aspx
<%@ Page Language="C#" %>
<!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 id="Head1" runat="server">
  <title>ASP.NET AJAX</title>
  <script language="Javascript" type="text/javascript">
  function pageLoad() {
    var s = "";
    Type.registerNamespace("OReilly");
    OReilly.Software = function(name, vendor) {
      var _name = (name != null) ? name : "unknown";
      var _vendor = (vendor != null) ? vendor : "unknown";
      this.getName = function() {
        return _name;
}
      this.setName = function(name) {
        _name = name;
      }
      this.getVendor = function() {
        return _vendor;
      }
      this.setVendor = function(vendor) {
        _vendor = vendor;
      }
    }
    Type.registerClass("OReilly.Software");
    OReilly.Browser = function(name, vendor, isJavaScriptSupported) {
      OReilly.Browser.initializeBase(this, new Array(name, vendor));
      var _isJavaScriptSupported = (isJavaScriptSupported != null) ?
isJavaScriptSupported : false;
      this.getIsJavaScriptSupported = function() {
        return _isJavaScriptSupported;
      }
      this.setIsJavaScriptSupported = function(isJavaScriptSupported) {
        _isJavaScriptSupported = isJavaScriptSupported;
      }
    }
    OReilly.Browser.registerClass("OReilly.Browser", OReilly.Software);
    OReilly.Software.prototype.toString = function() {
      return this.getName() + " from " + this.getVendor();
    }
    OReilly.Browser.prototype.toString = function() {
      return OReilly.Browser.callBaseMethod(this, "toString") +
         (this.getIsJavaScriptSupported() ? " (w/ JS)" : " (w/o JS)");
    };
    var ie = new OReilly.Browser("Internet Explorer", "Microsoft", true);
    s = ie.toString() + "
";
    var lynx = new OReilly.Browser("Lynx", null, false);
    s += lynx.toString();
    document.getElementById("output").innerHTML = s;
  }
  </script>
</head>
(body)
  <form id="form1" runat="server">
    (asp:ScriptManager ID="ScriptManager1" runat="server")
    (/asp:ScriptManager)
    <div id="output">
    </div>
  </form>
(/body)
</html>

Добавлено: 17 Июля 2018 23:10:19 Добавил: Андрей Ковальчук

Проверка обязательных полей

Наиболее часто используется класс requiredFieldValidator, который проверяет, чтобы элемент управления содержал какие-либо данные.

Ниже приводится разметка, которая создает поле ввода и область вывода сообщения об ошибке, создаваемого валидатором:

<input type="text" id="TextBox1" />
<span id="Error1" style="color: red;">*</span>


Как видите, метка, куда выводятся сообщения об ошибках, по умолчанию не скрыта. Платформа ASP.NET AJAX сама позаботится о том, чтобы ее скрыть.

Добавим в xml?script разметку с описанием элементов управления, принимающих участие в процессе проверки корректности данных, ограничившись проверкой элементов ввода и оставив за пределами рассмотрения другие элементы управления, выдающие сообщения об ошибках. В подэлементе <validators>, отвечающем за ввод, указываем используемый валидатор. В свойство errorMessage помещаем текст, отображаемый в случае ошибки. Валидаторы ASP.NET AJAX несколько отличаются от своих сородичей в ASP.NET. В ASP.NET AJAX значение свойства errorMessage выводится в виде всплывающей подсказки, которая появляется при наведении указателя мыши на неверный текст (то есть на элемент?валидатор ASP.NET AJAX).

Хотя мы и говорим о контроле текста, тем не менее это не эквивалент свойства Text, которое имеется у элементов-валидаторов в ASP.NET. Текст в метке с сообщением об ошибке – это текст, который задан заранее. Следующий пример демонстрирует xml?script, определяющий валидатор проверки обязательных для заполнения полей, связанный с элементом управления TextBox:
<textBox id="TextBox1">
  <validators>
    <requiredFieldValidator errorMessage="** TextBox1 value missing" />
  </validators>
</textBox>


На следующем шаге требуется задействовать элемент <validationErrorLabel>. Этот элемент имеет следующие атрибуты:
id
Идентификатор элемента управления, отображающего сообщения об ошибках
associatedControl
Идентификатор проверяемого элемента

Пример 15.7. Использование валидатора для проверки полей, обязательных к заполнению
ControlValidationRequiredField.aspx
<%@ Page Language="C#" %>
<!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 id="Head1" runat="server">
  <title>ASP.NET AJAX</title>
</head>
(body)
  <form id="form1" runat="server">
    (asp:ScriptManager ID="ScriptManager1" runat="server")
      <Scripts>
        (asp:ScriptReference Name="PreviewScript.js" 
                             Assembly="Microsoft.Web.Preview" /)
      </Scripts>
    (/asp:ScriptManager)
    <div>
      <input type="text" id="TextBox1" />
      <span id="Error1" style="color: red;">*</span>
      (br /)
      <input type="submit" />
    </div>
  </form>
  <script type="text/xml?script">
    <page xmlns:script="http://schemas.microsoft.com/xml?script/2005">
      <components>
        <textBox id="TextBox1">
          <validators>
            <requiredFieldValidator 
              errorMessage="** TextBox1 value missing" />
          </validators>
        </textBox>
        <validationErrorLabel id="Error1" associatedControl="TextBox1" />
      </components>
    </page>
  </script>
(/body)
</html>


Загрузите страницу, введите какие?нибудь данные в текстовое поле и затем покиньте его (что приведет к появлению события change – не надо щелкать на кнопке Submit Query). Теперь войдите в поле еще раз, удалите все данные и покиньте поле. Событие change произойдет еще раз и запустит проверку, предусмотренную элементом?валидатором. Ошибка индицируется появлением всплывающей подсказки и метки с более подробным поясняющим текстом. В данном случае валидатор генерирует ошибку, если пользователь не
ввел никаких данных, но тем не менее может отправить форму на сервер. Валидатор имеет лишь информационный характер.

Добавлено: 17 Июля 2018 23:08:40 Добавил: Андрей Ковальчук