- •1. Вводная часть
- •2. Знакомство со средой разработки на примере создания простого консольного приложения
- •3. Модификация консольного приложения
- •4. Публикация
- •5. О приложении к Лабораторной работе № 1
- •Лабораторная работа № 2: Создание простого приложения Windows Forms
- •Создание простого приложения Windows Forms
- •Модификация приложения Windows Forms
- •Завершающая часть
- •2. Создание простого приложения Windows Forms
- •3. Модификация приложения Windows Forms
- •4. Завершающая часть
- •5. О приложении к Лабораторной работе № 2
- •3. Лабораторная работа № 3: Windows Forms и использование некоторых элементов управления Лабораторная работа № 3: Windows Forms и использование некоторых элементов управления
- •Вводная часть
- •О приложении к Лабораторной работе № 3
- •1. Вводная часть
- •2. Создание приложения Windows Forms
- •3. Модификация приложения Windows Forms
- •4. Модификация приложения Windows Forms: элемент управления MenuStrip
- •5. Модификация приложения Windows Forms: элемент управления Button
- •6. Модификация приложения Windows Forms: элемент управления ToolTip
- •7. Модификация приложения Windows Forms: элемент управления ComboBox
- •8. Модификация приложения Windows Forms: элемент управления WebBrowser
- •9. Модификация приложения Windows Forms: добавляем исходный код
- •10. Завершающая часть
- •11. О приложение к Лабораторной работе № 3
- •4. Лабораторная работа № 4: Windows Forms — работа с формами Лабораторная работа № 4: Windows Forms — работа с формами
- •Вводная часть
- •О приложении к Лабораторной работе № 4
- •1. Вводная часть
- •2. Создание приложения Windows Forms
- •3. Модификация приложения Windows Forms
- •4. Модификация приложения Windows Forms: добавление новой формы
- •5. Модификация приложения Windows Forms: динамическое связывание параметров двух форм и передача параметра через прямой доступ к элементу формы
- •6. Модификация приложения Windows Forms: динамическое связывание параметров двух форм и передача параметра через передачу метода в конструктор формы
- •7. Модификация приложения Windows Forms: динамическое связывание параметров двух форм и передача параметра через класс делегата
- •8. Модификация приложения Windows Forms: динамическое связывание параметров двух форм и передача параметра через свойства
- •9. Завершающая часть
- •10. О приложении к Лабораторной работе № 4
- •5. Лабораторная работа № 5: Windows Forms — элементы управления Лабораторная работа № 5: Windows Forms — элементы управления
- •Вводная часть
- •О приложении к Лабораторной работе № 5
- •1. Вводная часть
- •2. Создание приложения Windows Forms
- •3. Модификация приложения Windows Forms
- •4. Модификация приложения Windows Forms: динамическое добавление и уничтожение элемента управления
- •5. Модификация приложения Windows Forms: стандартные диалоговые окна
- •6. Модификация приложения Windows Forms: открытие файла, сохранение файла и работа с текстом
- •7. Модификация приложения Windows Forms: прочее
- •8. Завершающая часть
- •9. О приложении к Лабораторной работе № 5
- •Лабораторная работа № 6: SolidWorks — работа с SolidWorks
- •2. Создание приложения Windows Forms
- •3. Модификация приложения Windows Forms: eDrawings 2012
- •4. Модификация приложения Windows Forms: организация работы с SolidWorks через приложение
- •5. Завершающая часть
- •6. О приложении к Лабораторной работе № 6
- •Лабораторная работа № 7: SolidWorks — использование SwCSharpAddin, работа с макросом и шаблоном детали
- •2. Создание приложения SwCSharpAddin
- •3. Модификация приложения SwCSharpAddin: макрос отрисовки болта
- •4. Модификация приложения SwCSharpAddin: построение через шаблон детали
- •5. Завершающая часть
- •6. О приложении к Лабораторной работе № 7
- •8. Лабораторная работа № 8: Создание простого приложения Windows Foundation Presentation Лабораторная работа № 8: Создание простого приложения Windows Foundation Presentation
- •Вводная часть
- •О приложении к Лабораторной работе № 8
- •1. Вводная часть
- •2. Создание приложения Windows Foundation Presentation
- •3. Модификация приложения Windows Foundation Presentation
- •4. Модификация приложения Windows Foundation Presentation: добавление нового элемента из библиотеки компонентов wpf
- •5. Модификация приложения Windows Forms: расширение функциональности приложения и работа с оформление
- •6. Модификация приложения Windows Foundation Presentation: различные возможности wpf
- •7. Модификация приложения Windows Foundation Presentation: немного о стилях и шаблонах
- •8. Завершающая часть
- •9. О приложении к Лабораторной работе № 8
- •Лабораторная работа № 9: Создание приложения-презентации Windows Foundation Presentation
- •2. Создание приложения Windows Foundation Presentation
- •3. Модификация приложения Windows Foundation Presentation
- •4. Модификация приложения Windows Foundation Presentation: работа с решением в Expression Blend
- •5. Завершающая часть
- •6. О приложении к Лабораторной работе № 9
- •Лабораторная работа № 10: Работа с базами данных — xml и ole
- •2. Создание приложения Windows Forms
- •3. Модификация приложения Windows Forms: odbc
- •4. Модификация приложения Windows Forms: ole
- •5. Модификация приложения Windows Forms: xml
- •6. Завершающая часть
- •7. О приложении к Лабораторной работе № 10
- •Лабораторная работа № 11: Динамическая связь приложений через библиотеку классов
- •2. Удалённый объект: создание библиотеки классов удалённого объекта
- •3. Клиент: создание приложения Windows Forms
- •4. Сервер: создание консольного приложения
- •5. Завершающая часть
- •6. О приложении к Лабораторной работе № 11
- •Лабораторная работа № 12: Автоматизация Microsoft Office Word
- •2. Создание приложения Windows Forms
- •3. Модификация приложения Windows Forms: создание и заполнение нового документа Microsoft Word
- •4. Модификация приложения Windows Forms: работа с шаблонами
- •5. Завершающая часть
- •6. О приложении к Лабораторной работе № 12
- •Лабораторная работа № 13: Автоматизация Microsoft Office Excel
- •2. Создание приложения Windows Forms
- •3. Модификация приложения Windows Forms: создание и заполнение нового документа Microsoft Excel
- •4. Модификация приложения Windows Forms: чтение данных с документа Microsoft Excel
- •5. Модификация приложения Windows Forms: прочие возможности Microsoft Excel
- •6. Завершающая часть
- •7. О приложении к Лабораторной работе № 13
- •Лабораторная работа № 14: Простой растровый редактор
- •2. Создание приложения Windows Forms
- •3. Модификация приложения Windows Forms: подготовка интерфейса редактора
- •4. Модификация приложения Windows Forms: функциональность растрового редактора
- •5. Завершающая часть
- •6. О приложении к Лабораторной работе № 14
- •15. Лабораторная работа № 15: Векторный редактор изображений Лабораторная работа № 15: Векторный редактор изображений
- •Вводная часть
- •О приложении к Лабораторной работе № 15
- •1. Вводная часть
- •2. Создание решения, приложения Windows Forms и библиотеки классов
- •3. Модификация приложения Windows Forms: подготовка интерфейса редактора и добавление файлов ресурсов
- •4. О будущей функциональности векторного редактора изображений
- •5. Модификация приложения Windows Forms: подготовка библиотеки классов
- •6. Модификация приложения Windows Forms: функциональность векторного редактора
- •7. Завершающая часть
- •8. О приложении к Лабораторной работе № 15
- •Лабораторная работа № 16: Windows Communication Foundation
- •2. Создание приложения wcf:
- •3. Модификация приложения wcf: приложение-клиент для wcf-службы
- •4. Создание приложения Windows Forms: сервер чата на wcf
- •5. Создание приложения Windows Forms: клиент чата на wcf
- •6. Завершающая часть
- •7. О приложении к Лабораторной работе № 16
- •Лабораторная работа № 17: Знакомство с Silverlight
- •2. Создание приложения Silverlight:
- •3. Модификация приложения Silverlight: первые шаги и полноэкранный режим
- •4. Модификация приложения Silverlight: простой проигрыватель mp3-файлов
- •5. Модификация приложения Silverlight: работа с анимацией
- •6. Завершающая часть
- •7. О приложении к Лабораторной работе № 17
- •Лабораторная работа № 18: Знакомство с asp.Net
- •2. Создание веб-приложения asp.Net
- •3. Модификация веб-приложения asp.Net: реализация различной функциональности
- •4. Модификация веб-приложения asp.Net: ajax
- •5. Завершающая часть
- •6. О приложении к Лабораторной работе № 18
- •Вводная часть
- •О приложении к Лабораторной работе № 19
- •1. Вводная часть
- •2. Создание приложения Windows Forms
- •3. Модификация приложения Windows Forms: подготовка интерфейса и добавление TabControl
- •4. Модификация приложения Windows Forms: вкладка «Просто фон!»
- •5. Модификация приложения Windows Forms: вкладка «Объекты и градиент»
- •6. Модификация приложения Windows Forms: вкладка «Мой монитор сломался!»
- •7. Модификация приложения Windows Forms: вкладка «Векторные часы»
- •8. Модификация приложения Windows Forms: вкладка «Огонь!!!»
- •9. Модификация приложения Windows Forms: вкладка «Дождик»
- •10. Завершающая часть
- •11. О приложении к Лабораторной работе № 19
- •Лабораторная работа № 20: Inventor — работа с Inventor
- •Вводная часть
- •О приложении к Лабораторной работе № 20
- •1. Вводная часть
- •2. Создание приложения Windows Forms
- •3. Модификация приложения Windows Forms: запуск и завершение приложения Inventor
- •4. Модификация приложения Windows Forms: создание новых документов
- •5. Модификация приложения Windows Forms: доступ к элементам документов Inventor
- •6. Завершающая часть
- •7. О приложении к Лабораторной работе № 20
- •Лабораторная работа № 21: Знакомство с языком f# (Эф-шарп) на примере простого приложения для командной строки
- •Вводная часть
- •О приложении к Лабораторной работе № 21
- •1. Вводная часть
- •2. Основные положения при работе с f#
- •3. Создание приложения «Учебник по f#»
- •4. Создание консольного приложения
- •5. О приложении к Лабораторной работе № 21
- •Лабораторная работа № 22: Различные примеры на f#
- •2. Создание приложения «Приложение f#»
- •3. Модификация приложения f#: match
- •4. Модификация приложения f#: создание форм и рисование объектов на форме
- •5. Модификация приложения f#: работа с базой данных Microsoft Access
- •6. О приложении к Лабораторной работе № 22
- •23. Дополнительная лабораторная работа № 1
- •24. Дополнительная лабораторная работа № 2
- •25. Дополнительная лабораторная работа № 3
- •Вводная часть
- •1. Вводная часть
- •2. Создание приложения Windows Foundation Presentation
- •3. Модификация приложения Windows Foundation Presentation: добавление ресурсов
- •4. Модификация приложения Windows Foundation Presentation: добавление исходного кода
- •5. Модификация приложения Windows Foundation Presentation: оформление элемента ListBox
- •6. Завершающая часть
- •7. О приложении к данной работе
4. Модификация веб-приложения asp.Net: ajax
Введение в AJAX:
AJAX (Asynchronous JavaScript And XML — асинхронный JavaScript «плюс» XML), обозначает подход к созданию веб-приложений, при котором после первичного вызова веб-страницы она получает возможность обмена данных с сервером и отображения данных без необходимости своей перегрузки.
Это обеспечивают ряд механизмов, основной из которых — движок AJAX. Это посредник между браузером (загруженной в него страницей) и сервером, способный передавать данные серверу и принимать их от него. Окончательно этот механизм сформировался в 1998 году, когда в Internet Explorer 5.0 были внедрены новые ActiveX-объекты, и, в частности, XMLHttpRequest-объект. Именно XMLHttpRequest приобрел наибольшую популярность и поддержку в других браузерах (Mozilla Firefox, начиная с версии 1.0, Opera, начиная с версии 8.0, Safari...).
Движок AJAX (XMLHttpRequest) производит необходимые запросы асинхронно, обычно при помощи XML, не прерывая взаимодействия пользователя с приложением. Ответ сервера — это либо текстовая строка, либо XML документ.
XMLHttpRequest-объект создаётся для страницы, именно как объект, в момент её загрузки или при необходимости обмена данных с сервером. Созданный объект имеет свои методы и свойства, доступные коду JavaScript-скриптов страницы. Вот основные:
open('Тип запроса «GET» или «POST»', 'URL страницы", 'исполнение запроса — «True» — асинхронное исполнение', 'username', 'pasword') — создаёт запрос к серверу.
send('content') — отправляет запрос на сервер. В качестве значений может быть null или данные для запроса «POST» или пустая строка.
onreadystatechange — событие, возникающее при смене состояния объекта:
0 — (uninitialized) — запрос не отправлен;
1 — (loading) — объект инициализирован;
2 — (loaded) — получен ответ от сервера;
3 — (interactive) — соединение с сервером активно;
4 — (complete) — объект завершил работу;
responseText — взять данные от сервера в виде строки.
responseXML — взять данные от сервера в виде XML;
status — свойство статус HTTP-ответа (например, 404 — страница не найдена на сервере).
Все свойства и методы объекта, доступны из JavaScript скриптов. Таким образом, AJAX, как её трактуют сами разработчики, это несколько технологий, объединённых в новое направление:
стандартизованное представление данных с использованием XHTML и CSS;
динамическое отображение и взаимодействие при помощи DOM (Document Object Model);
обмен и управление данными через XML и XSLT;
асинхронные получение данных с использованием XMLHttpRequest;
JavaScript, как язык, связывающий все компоненты.
Подготовка к реализации функциональности AJAX:
Создаём новую страницу («Веб-форма, использующая главную страницу») с именем Ajax.aspx. В качестве основного шаблона выбираем Site.Master. HTML-код добавленной страницы будет таким:
<%@ Page Title="Страница с AJAX" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Ajax.aspx.cs" Inherits="LWP18ASPNET.Axaj" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>
Работа с технологией AJAX!
</h2>
<p align="center">
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:Button ID="Button1" runat="server" Text="Серверная кнопка" />
</p>
</asp:Content>
Страница содержит одну кнопку, один Label (в качестве базовых элементов управления).
Добавим страницу в меню (файл Site.Master). Найдём там:
<asp:MenuItem NavigateUrl="~/Page.aspx" Text="Страница"/>
Добавим после:
<asp:MenuItem NavigateUrl="~/Ajax.aspx" Text="AJAX"/>
Теперь добавим код для события Page_Load файла Ajax.aspx.cs:
if (!IsPostBack) { Label1.Text = "Текст при первой загрузке страницы Default.aspx"; }
else { Label1.Text = "Текст при перегрузке страницы"; }
Этот код будет сигнализировать о том, что страница не перегружается при использовании AJAX-вызовов. Загрузим веб-сайт, текст в Label1 будет «Текст при первой загрузке страницы Default.aspx», нажимаем серверную кнопку — «Текст при перегрузке страницы». По смене текста будем судить о том, перегружалась или нет страница:
Рис. 4. 1. Результат работы веб-приложения ASP.NET: загружена «Страница с AJAX»
Среда разработки по умолчанию умеет работать со следующими компонентами AJAX:
Выполним самый простейший вариант, который не требует действия пользователя, а именно AJAX-часы.
Реализации таких часов: вначале добавим простой Label. Затем, на странице, которая будет использовать эту технологию должен быть обязательно элемент управления ScriptManager (группа AJAX-расширения панели элементов). Добавляем его на страницу. Добавляем компонент UpdatePanel. При постбэке из этого элемента будет обновляться только эта часть, то есть элементы внутри UpdatePanel. Внутрь UpdatePanel необходимо добавить тэг ContentTemplate и затем в него уже добавлять компоненты (добавим один TextBox). Добавим на форму компонент UpdateProgress, отображаться который будет, если запрос на обновление UpdatePanel будет происходить дольше, чем указано в свойстве DisplayAfter. Ну и для полноты компонент Timer, который будет перезагружать UpdatePanel через интервал указанный в свойстве Interval (в нашем случае это будет одна секунда):
</p>
<p>
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
</p>
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate >
<asp:Timer ID="Timer1" runat="server" Interval="1000">
</asp:Timer>
<asp:TextBox ID="TextBox1" runat="server" ReadOnly="True"></asp:TextBox>
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdateProgress ID="UpdateProgress1" runat="server">
<ProgressTemplate>
Обновление...
</ProgressTemplate>
</asp:UpdateProgress>
</div>
Так это будет выглядеть в представлении «Конструктор»:
Теперь код события Page_Load, который будет реализовывать функции часов, и обновлять TextBox через каждую секунду, посредством всех добавленных элементов (Label2 же будет неизменным и будет содержать время старта страницы, так как находится вне UpdatePanel):
Label2.Text = DateTime.Now.ToString();
TextBox1.Text = DateTime.Now.ToString();
Запускаем, следим за текстом в TextBox (временем) и за текстом в Label1 (не получили ли мы «PostBack» случаем):
Рассмотрим несколько простых примеров с действиями. Начнём с самого базового и часто-описываемого: загрузка данных из текстового файла. Будем применять отдельный класс.
Загрузка данных из одного файла:
Создаём в веб-проекте новый текстовый файл AJAX_Text1.txt и заносим туда любой текс, например: «Здесь расположен текст первого текстового файла AJAX_Text1.txt!». Для создания файла выполняем Проект -> Добавить новый элемент...: в открывшемся окне ищем группу Данные и далее Текстовый файл:
Рис. 4. 2. Добавление нового элемента – LWP18ASPNET: Текстовый файл
Сохраняем текст в файле:
Теперь, необходимо создать дополнительный класс для работы AJAX и исполнения загрузки из этого файла. Будем использовать HttpHandler.
ASP.NET обрабатывает запросы HTTP с помощью обработчика HttpHandler, который доступен по умолчанию для всех запрашиваемых страниц c расширением *.aspx и служб (*.asmx). HttpHandlers — это классы, реализующие интерфейсы IHttpHandler и IHttpAsyncHandler и, по существу, служат ISAPI-фильтром, обработки HTTP-запросов. Запросы могут обрабатываться как синхронно (интерфейс System.Web.IHttpHandler) — HttpHandler возвращает управление по завершению обработки запроса или асинхронно (интерфейс System.Web.IHttpAsyncHandler) — путём запуска процессов обработки и возврата управления. Иначе — HttpHandler’ы могут передавать выполнение запроса другим классам или же сами обрабатывают запрос и возвращают результат клиенту.
Важной особенностью ASP.NET является то, что HttpHandler может быть создан разработчиком для выполнения своих конкретных задач.
Для того, чтобы любой класс мог выполнять функции HttpHandler’а, необходимо реализовать в нём интерфейс System.Web.IHttpHandler или System.Web.IHttpAsyncHandler. Можно также создавать экземпляр обработчика HttpHandler с помощью класса, реализующего интерфейс IHttpHandlerFactory.
Интерфейсы System.Web.IHttpAsyncHandler и System.Web.IHttpHandler должны включать методы ProcessRequest (обработчик запроса), свойства IsReusable (поддержка организация пулов). Для интерфейса System.Web.IHttpAsyncHandler требуются дополнительно методы BeginProcessRequest и EndProcessRequest (инициализация и завершение асинхронных вызовов).
Выполним: Проект -> Добавить класс... (Shift+Alt+C). Имя вводим как AJAX.cs. Вставляем туда код:
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
public class AJAX : IHttpHandler
{
#region Члены IHttpHandler
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
HttpRequest Request = context.Request;
HttpResponse Response = context.Response;
// Здесь будет код обработки запроса
}
#endregion
}
Подготовим «почву» для работы AJAX. Откроем файл Site.Master и найдём строчки:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
Добавим после:
<script language = "javascript" type="text/javascript">
function getDataFromServer(dataSource, targetControl)
{
}
</script>
Добавим на страницу Ajax.aspx ещё один серверный Label и Input (Buton). Для события onclick кнопки запишем вызов некоторой функции getDataFromServer('AJAX_Text1.txt', 'Label3') при нажатии кнопки. Задача функции — вывести данные в Label3 из файла без перегрузки страницы. HTML-код будет таким:
<p align="center">
<span class="bold" style="color:Green">[ реализация технологии AJAX: загрузка текста из файла ]</span><br />
<asp:Label ID="Label3" runat="server" Text="Здесь будет выводимый текст"></asp:Label><br />
<input type="button" id="Button2" value="Загрузить текст из AJAX_Text1.txt"
onclick="getDataFromServer('AJAX_Text1.txt', 'MainContent_Label3')"/>
</p>
Заполняем код скрипта:
var myAjaxObject = false;
if (window.XMLHttpRequest) {
myAjaxObject = new XMLHttpRequest();
}
else {
if (window.ActiveXObject) {
myAjaxObject = new ActiveXObject("Microsoft.XMLHTTP");
}
}
if (myAjaxObject) {
myAjaxObject.open("GET", dataSource);
myAjaxObject.onreadystatechange =
function () {
if (myAjaxObject.readyState == 4 && myAjaxObject.status == 200) {
var targetObj = document.getElementById(targetControl);
targetObj.innerHTML = myAjaxObject.responseText;
delete myAjaxObject;
myAjaxObject = null;
}
}
myAjaxObject.send(null);
}
Поясним. Первое, что добавляем в скрипт: создание XMLHttpRequest-объекта.
Создание объектов различно для браузеров Mozilla Firefox, Opera, Safari и некоторых других (new XMLHttpRequest()) и Internet Explorer (new ActiveXObject("Microsoft.XMLHTTP")), что и отражает данный код. Далее, после проверки того, что объект создан, мы создаём запрос к серверу (метод «open»). К событию, возникающему при смене состояния объекта (onreadystatechange), добавляем безымянную функцию, задачей которой будет слежение за состоянием объекта (нас интересует завершение получения данных):
if (myAjaxObject) {
myAjaxObject.open("GET", dataSource);
myAjaxObject.onreadystatechange =
function () {
}
}
В теле функции определяем, что загрузка данных завершена (readyState == 4) и обмен прошёл без ошибок (status == 200). Осталось получить текст (myAjaxObject.responseText) и присвоить его свойству innerHTML элемента Label3:
if (myAjaxObject.readyState == 4 && myAjaxObject.status == 200) {
var targetObj = document.getElementById(targetControl);
targetObj.innerHTML = myAjaxObject.responseText;
delete myAjaxObject;
myAjaxObject = null;
И последнее: отсылка запроса на сервер:
myAjaxObject.send(null);
В результате имеем работающий код, выполняющий динамическое чтение данных из текстового файла:
После нажатия кнопки «Загрузить текст из AJAX_Text1.txt» видим, что страница не обновлялась (сигнализатор: текст в Label1 на странице).
Используем класс AJAX.cs:
Расширим текст кода файла класса AJAX.cs. Найдём:
HttpResponse Response = context.Response;
// Здесь будет код обработки запроса
Добавим после:
// Чтение файла
String s = AppDomain.CurrentDomain.BaseDirectory + (@"AJAX_Text1.txt");
byte[] bText;
using (FileStream filestream = new FileStream(s, FileMode.Open, FileAccess.Read))
{
int bufSize = (int)filestream.Length;
bText = new byte[bufSize];
filestream.Read(bText, 0, (int)filestream.Length);
}
// Так мы вновь потеряем кириллицу
// Response.BinaryWrite(bText);
// А так нет
s = System.Text.Encoding.UTF8.GetString(bText);
Response.Write(s);
Теперь нужно создать файл содержащий скрипт из предыдущего примера. Добавим в наш проект одну пустую форму (Форма Web Forms) с именем Ajax_Script.aspx и следующим простым кодом (заменим код созданного файла):
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Ajax_Script.aspx.cs" Inherits="LWP18ASPNET.Ajax_Script" %>
<!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></title>
<script language = "javascript" type="text/javascript">
function getDataFromServer(dataSource, targetControl) {
var myAjaxObject = false;
if (window.XMLHttpRequest) {
myAjaxObject = new XMLHttpRequest();
}
else {
if (window.ActiveXObject) {
myAjaxObject = new ActiveXObject("Microsoft.XMLHTTP");
}
}
if (myAjaxObject) {
myAjaxObject.open("GET", dataSource);
myAjaxObject.onreadystatechange =
function () {
if (myAjaxObject.readyState == 4 && myAjaxObject.status == 200) {
var targetObj = document.getElementById(targetControl);
targetObj.innerHTML = myAjaxObject.responseText;
delete myAjaxObject;
myAjaxObject = null;
}
}
myAjaxObject.send(null);
}
}
</script>
</head>
</html>
Теперь организуем «регистрацию» нашего класса и привязку его к скрипту. Откроем корневой Web.config, найдём там
<system.web>
Добавим после:
<httpHandlers>
<add verb="GET" path="Ajax_Script.aspx" type="AJAX" />
</httpHandlers>
И наконец, создаём «интерфейс» на странице Ajax.aspx:
<p align="center">
<span class="bold" style="color:Green">[ реализация технологии AJAX: загрузка текста из файла, используя класс ]</span><br />
<asp:Label ID="Label4" runat="server" Text="Здесь будет выводимый текст"></asp:Label><br />
<input type="button" id="Button3" value="Загрузить текст из AJAX_Text1.txt"
onclick="getDataFromServer('Ajax_Script.aspx', 'MainContent_Label4')"/>
</p>
Выбираем загружаемую информацию:
Создаём ещё один текстовый файл с именем AJAX_Text2.txt и текстом «Здесь расположен текст первого текстового файла AJAX_Text2.txt!».
Отредактируем ради новой функциональности код класс AJAX.cs, изменим всю функцию ProcessRequest следующим образом:
public void ProcessRequest(HttpContext context)
{
HttpRequest Request = context.Request;
HttpResponse Response = context.Response;
// Здесь будет код обработки запроса
String id = string.Empty;
// Извлечение параметров
id = Request.QueryString.Get(0);
if (!string.IsNullOrEmpty(id))
{
if (id == "1") { id = AppDomain.CurrentDomain.BaseDirectory + (@"AJAX_Text1.txt"); }
else { id = AppDomain.CurrentDomain.BaseDirectory + (@"AJAX_Text2.txt"); }
}
else { return; }
byte[] bTextid;
using (FileStream filestream = new FileStream(id, FileMode.Open, FileAccess.Read))
{
int bufSize = (int)filestream.Length;
bTextid = new byte[bufSize];
filestream.Read(bTextid, 0, (int)filestream.Length);
}
id = System.Text.Encoding.UTF8.GetString(bTextid);
Response.Write(id);
}
Также подправим код для предыдущего примера, найдём в файле Ajax.aspx:
onclick="getDataFromServer('Ajax_Script.aspx', 'MainContent_Label4')"/>
Изменим на:
onclick="getDataFromServer('Ajax_Script.aspx?id=1', 'MainContent_Label4')"/>
И добавим новый HTML-код (в тэге «p»):
<p align="center">
<span class="bold" style="color:Green">[ реализация технологии AJAX: загрузка текста из файла, используя класс с выбором ]</span><br />
<asp:Label ID="Label5" runat="server" Text="Здесь будет выводимый текст"></asp:Label><br />
<input type="button" id="Button4" value="Загрузить текст из AJAX_Text1.txt"
onclick="getDataFromServer('Ajax_Script.aspx?id=1', 'MainContent_Label5')"/>
<input type="button" id="Button5" value="Загрузить текст из AJAX_Text2.txt"
onclick="getDataFromServer('Ajax_Script.aspx?id=2', 'MainContent_Label5')"/>
</p>
Выбор и отображение изображений:
Создаём новый класс AJAX_Image.cs с кодом:
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
public class AJAX_Image : IHttpHandler
{
#region Члены IHttpHandler
public bool IsReusable
{
get { return true; }
}
void IHttpHandler.ProcessRequest(HttpContext context)
{
HttpRequest Request = context.Request;
HttpResponse Response = context.Response;
string s = string.Empty;
s = Request.QueryString.Get(0);
if (!string.IsNullOrEmpty(s))
{
if (s == "1") { s = AppDomain.CurrentDomain.BaseDirectory + (@"Image1.jpg"); }
else{ s = AppDomain.CurrentDomain.BaseDirectory + (@"Image2.jpg"); }
}
else { s = AppDomain.CurrentDomain.BaseDirectory + (@"Image1.jpg"); }
using (MemoryStream memorystream = new MemoryStream())
{
Bitmap bitmap = null;
try
{
bitmap = new Bitmap(s);
bitmap.Save(memorystream, ImageFormat.Png);
byte[] b = memorystream.GetBuffer();
// Формат файла рисунка может быть отличен от исходного файла
Response.ContentType = "image/png";
Response.BinaryWrite(b);
bitmap.Dispose();
}
catch (Exception) { }
memorystream.Dispose();
}
}
#endregion
}
Регистрируем класс в Web.config (в блоке httpHandlers):
<add verb="GET" path="Ajax_Script_Image.aspx" type="AJAX_Image" />
Создаём копию страницы со скриптом Ajax_Script_Image.aspx с кодом (изменена одна строка):
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Ajax_Script_Image.aspx.cs" Inherits="LWP18ASPNET.Ajax_Script_Image" %>
<!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></title>
<script language = "javascript" type="text/javascript">
function getImageFromServer(dataSource, targetControl) {
var myAjaxObject = false;
if (window.XMLHttpRequest) {
myAjaxObject = new XMLHttpRequest();
}
else {
if (window.ActiveXObject) {
myAjaxObject = new ActiveXObject("Microsoft.XMLHTTP");
}
}
if (myAjaxObject) {
myAjaxObject.open("GET", dataSource);
myAjaxObject.onreadystatechange =
function () {
if (myAjaxObject.readyState == 4 && myAjaxObject.status == 200) {
var targetObj = document.getElementById(targetControl);
targetObj.innerHTML = "<img src= " + dataSource + ">";
delete myAjaxObject;
myAjaxObject = null;
}
}
myAjaxObject.send(null);
}
}
</script>
</head>
</html>
Тот же скрипт помещаем в Site.Master после предыдущего добавленного в этот файл скрипта. Не забудем это сделать, иначе функция JavaScript будет не определена!
И наконец, создаём интерфейс для реализации выбора и отображения изображения в файле Ajax.aspx:
<div align="center" id="iddivforimage"></div>
<div align="center">
<select id="Select1"
onchange="getImageFromServer('Ajax_Script_Image.aspx?='+this.options[this.selectedIndex].value,
'iddivforimage')">
<option value="1">Рисунок № 1</option>
<option value="2">Рисунок № 2</option>
</select>
</div>
Добавим в корень проекта два изображения с именами Image1.jpg и Image2.jpg (импортируем извне). Например, в данном случае были использованы два изображения:
Первое:
Второе:
«AJAXML»:
Перейдём непосредственно к использованию XML-данных. Как видно из рассмотренных свойств и методов объекта XMLHttpRequest, он имеет специальное свойство для трактовки данных, полученных от сервера, как XML-данные. Это свойство, доступное для чтения — responseXML. Далее, JavaScript имеет методы для разбора XML-файлов.
Следующий пример демонстрирует простейшее использование совместной работы AJAX и JavaScript при получении и разборке XML-данных с сервера без перегрузки страницы.
Создаём простой XML-файл (XML-файл — в окне добавления нового объекта)с именем Data.xml и поместим его в директорию веб-проекта. Структура файла будет такой:
<?xml version="1.0" standalone="yes" ?>
<sites>
<site comments="World Wide Web Consortium (W3C)">http://www.w3.org/</site>
<site comments="Сайт корпорации Microsoft">http://www.microsoft.com</site>
<site comments="Russian on the Net">http://www.ru</site>
</sites>
Создаём новый файл скрипта Ajax_Script_XML.aspx с кодом:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Ajax_Script_XML.aspx.cs" Inherits="LWP18ASPNET.Ajax_Script_XML" %>
<!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></title>
<script language="javascript" type="text/javascript">
function getXMLFromServer(dataSource, targetControl) {
var myAjaxObject = false;
if (window.XMLHttpRequest) { myAjaxObject = new XMLHttpRequest();}
else { if (window.ActiveXObject) { myAjaxObject = new ActiveXObject("Microsoft.XMLHTTP"); } }
if(myAjaxObject)
{
myAjaxObject.open("GET", dataSource);
myAjaxObject.onreadystatechange =
function()
{
if (myAjaxObject.readyState == 4 && myAjaxObject.status == 200)
{
var xmlDocument = myAjaxObject.responseXML;
var i;
var points = xmlDocument.getElementsByTagName("site");
var html='';
for (i = 0; i < points.length; i++)
{
html=html+'<a href="'+points[i].firstChild.data+'" target="blank">'+
points[i].getAttribute ('comments')
+'</a><br/>';
}
var targetObj = document.getElementById(targetControl);
targetObj.innerHTML = html + "";
}
}
myAjaxObject.send(null);
}
}
</script>
</head>
</html>
Не забываем поместить код скрипта (<script> ... </script>) в тэг head файла Site.Master.
Создаём новый класс AJAX_XML.cs с кодом:
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
public class AJAX_XML : IHttpHandler
{
#region Члены IHttpHandler
bool IHttpHandler.IsReusable
{
get { return true; }
}
void IHttpHandler.ProcessRequest(HttpContext context)
{
HttpRequest Request = context.Request;
HttpResponse Response = context.Response;
string s = string.Empty;
s = AppDomain.CurrentDomain.BaseDirectory + (@"Data.xml");
using (FileStream filestream = new FileStream(s, FileMode.Open, FileAccess.Read))
{
// Чтение символов из файла
using (TextReader streamreader = new StreamReader(s, System.Text.Encoding.Default))
{
s = streamreader.ReadToEnd();
Response.ContentType = "text/xml"; // Ключевая строка для передачи XML
Response.BinaryWrite(System.Text.Encoding.UTF8.GetBytes(s));
}
}
}
#endregion
}
Регистрируем класс в Web.config:
<add verb="GET" path="Ajax_Script_XML.aspx" type="AJAX_XML" />
Код элементов управления для файла Ajax.aspx:
<p align="center">
<span class="bold" style="color:Green">[ реализация технологии AJAX: загрузка текста из XML-файла, используя класс ]</span><br />
<input type="button" id="Button7" value="Загрузить XML-файл"
onclick="getXMLFromServer('Ajax_Script_XML.aspx', 'iddivforxml')" /><br />
<asp:Label ID="Label7" runat="server" Text="Ниже будет выводимое содержимое:"></asp:Label>
</p>
<div align="center" id="iddivforxml"></div>
Готово. Компилируем, проверяем работоспособность. Перед компиляцией перемещаемся на страницу Default.aspx (должна быть активной вкладкой в среде разработки). Перед компиляцией изменим заголовок на странице. Найдём в файле Site.Master строчки:
<div class="title">
<h1>
Мое приложение ASP.NET (C#)
</h1>
И изменим на:
<div class="title">
<h1>
Знакомство с ASP.NET (C#)
</h1>