Приложения ASP.NET ASP.NET — это способ, предусмотренный в .NET для создания динамических web-сайтов. Как и ADO.NET, ASP.NET заимствует свое название от предшеству- ющей технологии Active Server Pages (ASP — активные серверные страницы), но в данном случае сходство этим практически и ограничивается. В то время как ASP-страницы интерпретировались и создавались на функционально ограниченных языках описания сценариев VBScript и JScript, приложения ASP.NET компилиру- ются на язык MSIL точно также, как и другие приложения .NET. Это означает, что у нас появляется возможность описывать их на тех же языках программирова- ния, что и остальные приложения .NET. В данном случае особенно важно (посколь- ку книга посвящена языку.программирования С#), что можно писать приложения ASP.NET на С#. Другим огромным преимуществом ASP.NET является использование управляю- щих элементов на стороне сервера. В ASP также имелась возможность включать управляющие элементы HTML (такие, как кнопки и другие элементы форм) в со- здаваемые страницы, однако делать это приходилось вручную, а реагировать на лю- бой ввод пользователя в такие элементы (например, пользователь щелкнул мышью на кнопке) можно было либо с помощью выполнения сценария JavaScript на кли- ентской стороне, либо повторно отправляя страницу серверу. В первом случае проблема заключается в том, что в различных браузерах используются разные реа- лизации JavaScript, поэтому практически не представляется возможным создавать такие изощренные программы, которые могли бы работать как на Netscape, так и IE. Кроме того, существуют пока такие допотопные браузеры, которые вообще не поддерживают JavaScript. Интернет не сохраняет свое состояние, поэтому при повторной отправке страницы на сервер теряется вся информация, хранящаяся в переменных страницы. Чтобы этого не произошло, следует создать довольно сложный код, который позволит сохранять эти переменные в HTML-элементах или в строке запроса URL. ASP.NET позволяет разрешить эти проблемы за счет использования управляю- щих элементов на стороне сервера. Такие элементы генерируют HTML-код, ко- торый передается браузеру для вывода управляющего элемента, но они, кроме того, генерируют еще и функции на JavaScript и скрытые управляющие элементы, в которых сохраняется их текущее состояние. Если страница передается серверу, то вместе с ней серверу передается и вся соответствующая информация; управля- ющий элемент автоматически обрабатывает эту информацию и изменяет HTML таким образом, чтобы вывести управляющий элемент на экран. В простейшем ва- рианте это означает, что мы получаем возможность использовать такие текстовые окна, которые "запоминают" значения, введенные пользователем, но если посмот- реть немного дальше, то они позволяют ASP.NET использовать более сложные управляющие элементы (например, управляющий элемент календарь), чем те, с которыми мог справиться ASP. 680 Глава 24 Последнее, и, возможно, наиболее важное преимущество заключается в том, что ASP.NET предоставляет простой способ создания web-служб. На текущий мо- мент можно представить себе web-службы просто как составные части Паутины, однако они являются гораздо более сложной темой, и им будет посвящена следую- щая глава целиком. Для того чтобы увидеть какой-либо код, работающий на стороне сервера, в действии, зайдите на сайт Amazon.com и выберите свой любимый роман. Стра- ницы с подробной информацией о романе, которую вы видите перед собой, не су- ществует на сервере. На самом деле на сервере имеется некоторый шаблон, в котором описывается общий вид страницы, и, когда вы запрашиваете какую- нибудь страницу, этот код выполняется на сервере, извлекает информацию о за- требованной книге из базы данных и вставляет эту информацию в шаблон. То, что возвращается в ответ на ваш запрос,— это HTML; мы поговорим об этом несколь- ко позже. На протяжении всей главы мы будем заниматься кодом, который выполняется на стороне сервера. Вашему браузеру придется выполнять относительно неболь- шой объем работы при выводе страницы. Начиная с этого момента, под "активными страницами" будут иметься в виду страницы, которые могут быть созданы посредством как классического ASP, так и ASP.NET. Обе технологии используют один и тот же основной подход к созданию страниц — просто ASP.NET является намного более мощным средством, и вы сами поймете, насколько существенно упрощается создание web-сайтов при использовании ASP.NET. ; //focaihost/Weblog/Delfsuit, aspx D i s r a e l i ' s W e b l o g Copyright © Wrox Press 2001 Рассмотрим пример. Он выглядит как обыкновенная web-страница (см. рис. слева). Обратите внимание на строку с инфор- мацией об авторских правах в нижней части страницы. Представим себе, что эта строка появляется на каждой странице нашего web- сайта. Сейчас она относится к 2001 году, и это означает, что при наступлении нового, 2002 года нам придется пройти по всему сайту и для каждой страницы изменить зна- чение 2001 на 2001-2002. При использовании "активных страниц" можно сконфигурировать страницу таким образом, что она будет самостоятельно определять год и вносить изменения авто- матически. Отсюда следует, что мы освобождаемся от решения этой простой, но очень нудной административной задачи на все последующие годы. Это очень банальный пример. Технология создания активных страниц вступает в свои права, когда вы привязываете свой сайт к какой-нибудь базе данных или к каким-либо другим функциональным возможностям, подобным тележке покупа- теля в электронной коммерции. В этой главе мы планируем рассмотреть, каким образом можно создать "web-регистратор". Он является web-аналогом обычного дневника, который мы, вместо того, чтобы записывать его на бумагу и запирать в ящик стола, сделаем общедоступным с. помощью Паутины. Принцип при этом остается тем же самым — у вас есть некая дата, а под этой датой располагается список идей и событий, относящихся к этому дню. Один из популярных таких спи- сков вы можете найти по адресу www.bloghop.com. Приложения ASP.NET 681 Создание web-регистратора Для того чтобы продемонстрировать мощь и функциональные возможности ASP.NET, разработаем приложение web-регистратора с нуля — начиная с един- ственной чистой web-страницы и последовательно добавляя все новые и новые возможности и давая необходимые пояснения по мере продвижения к цели. Снача- ла мы продемонстрируем, каким образом можно выводить на экран записи в web- регистратор — по одной или сразу несколько. Затем перейдем к рассмотрению возможностей сортировки записей, их добавления и редактирования, после чего коротко остановимся на вопросах, касающихся безопасности, например, на огра- ничении доступа к сайту и аутентификации пользователей, зашедших на страницу регистрации. По мере этого продвижения вы познакомитесь со следующими темами: • Добавление динамического (активного) содержимого (контента) в web-страницы с помощью управляющих элементов web-форм • Реализация обработчиков событий для каждого управляющего элемента, используя код на С# Q Создание внешне привлекательного пользовательского интерфейса • Расширение пользовательского интерфейса для поддержки дополнительных функциональных возможностей Основы создания приложения Можно разрабатывать приложения в Visual Studio.NET, используя шаблон ASP.NET Web Application, который создает новый проект и автоматически конфигу- рирует IIS так, чтобы можно было отлаживать проект по мере его создания. Первое, что мы собираемся сделать,— это создать на web-сайте простую неиз- меняемую страницу (другими словами, страницу, в которой нет никаких динамиче- ских элементов), с тем чтобы убедиться, что все работает так, как и задумывалось. Эта страница будет создаваться как страница ASP.NET (с расширением .aspx), поскольку, несмотря на то, что изначально у этой страницы нет динамических эле- ментов, со временем они появятся. Для ASP-страниц обычно используется расширение .asp, обозначающее, естественно, Active Server Pages. Для ASP.NET страницы используют расширение .aspx, что является разновидностью ASP-i первоначального названия ASP.NET. Практикум: создание страницы web-регистратора 1. Откройте Visual Studio.NET и выберите пункт меню File | New | Project. Из списка Project Types зыберите Visual C# Projects, а из списка Templates — ASP.NET Web Application. В окно Name введите название — Weblog (см. рис. справа). Pro&cfc types; .•#€$5 '" T j Vi-AieS О? F r o n t s • CU Visual C++- Projects • i I S e t u p ami I ep --. tmt-k f ? n&tU + Z.1 Other Projects J j vtiud LttJ. S Jut JO*1» ;Л project for crcu?ing on application i*tb .5 Web o Арр1с&Й0Г1 < ASP.NETWeb ASP.NET Web WebCcnUd ;;n Service library zl ' • 682 Глава 24 2. Прежде чем нажать ОК, обратите внимание на то, что в окне Location находится следующий URL: http://localhost. Это подсказывает, в каком именно месте будет создаваться новый сайт, и, когда мы говорим об Интернете, localhost всегда обозначает ваш собственный компьютер. 3. Для создания нового проекта нажмите ОК. 4. Воспользовавшись Solution Explorer, щелкните правой кнопкой мыши на проекте Weblog и выберите пункт меню Add | Add Web Form. Введите имя Default.aspx и щелкните мышью на Open. 5. Это должно привести к открытию новой страницы в режиме Design (разработка), однако может и не привести, если вы перед этим экспериментировали с ASP. Если страница находится в режиме Design, то на экране вы должны увидеть следующие два сообщения: "The page you are working on is in grid layout mode, and objects will be arranged using absolute (x and y) coordinates." (Страница, с которой вы работаете, находится в режиме вывода с сеткой, и объекты будут размещаться на ней с использованием абсолютных координат (х и у).) и "То use flow layout (top to bottom, as in a word processing document), change the pageLayout property of the DOCUMENT to FlowLayout." (Для использования потокового вывода (сверху вниз, как при обработке документов в текстовых llhe page you are working on is in grid layout mode, and ; ; ; objects^1 be arranged using absolute (x and y); ; ; - coordinates.* To u s e flow layout ( t o p t o bottom, a s m a word > - - • " • > • - н а F l o w L a y o u t . ) , к а к п о к а з а н о processing document), change the pageLayout property^ of the DOCUMENT to FtowUyout. Для того чтобы получить редакторах) измените значение свойства DOCUMENT pageLayout на рисунке слева. вывод с сеткой, представленный на рисунке, следует выбрать пункт меню View | Design. 6. С помощью программы разработки Designer можно создавать страницы Двумя СПОСОбаМИ — В режиме GridLayout ИЛИ В режиме FlowLayout. С точки зрения автора более предпочтительным является режим FlowLayout. В окне Properties измените значение свойства pageLayout на FlowLayout. Точки, которые выводились на странице, исчезнут. Программа Designer предлагает набор инструментов, которые позволяют об- легчить процедуру создания web-сайта. На практике это означает, что создавать web-страницы так же просто, как писать письма с помощью Microsoft Word. Однако предлагаемые в программе Designer инструменты налагают весьма существенные ограничения, поскольку они предназначаются для людей, которые интересуются только разработкой web-интерфейсов, а не программированием. Автор уверен в том, что раз уж вы дочитали книгу до этой главы, то вам нравится создавать про- граммное обеспечение для компьютеров, поэтому будем придерживаться "старой школы" и создавать страницы с помощью HTML. Если вы чувствуете себя неуве- ренно при программировании на HTML, то, перед тем как двигаться дальше, вы можете просмотреть предыдущую главу и освежить в памяти основы программиро- вания на HTML. Приложения ASP.NET 683 7. Выберите пункт меню View | HTML Source. Появится редактор HTML. (В качестве альтернативного варианта в нижней части редактора кода вы сможете обнаружить две маленькие кнопки, помеченные как Design и HTML. При желании можно пользоваться ими для переключения из одного режима представления в другой.) 8. К скелету HTML-кода добавьте строки, выделенные серым цветом: <%@ Page 1апдиаде=ис#и Codebehind="Default.aspx.cs" AutoEventWireup="false" Inherits=Weblog.CDefault" %> <JDOCTYPE HTML PUBLIC "-//ЮС/ /DTD HTML 4.0 Transitional//EN" > <html> <head> <meta name ="GENERATOR" Content="Microsoft Visual Studio 7.0"> <meta name ="CODEJLANGUAGEи Content="C#"> <meta name ="vs__defaultClientScript" Content="JavaScript (ECMAScript)"> <meta name ="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </head> <body> <form id="Default" method="post" runat="server"> <div> Disraeli's Weblog : : : .' : < b r > • . - <div> Copyright © Wrox Press 2001 • ' •- ' •• •• • • < / d i V > ' • •' ' ••••• •••. • • : •• </form> </body> </html> ( xj I [ File £dst View Favorites Tool? Help J- Ш -dl j €|Searc*V »nitr&* » ^IMs Disraeli's Weblog Copyright © Wrox Press 2001 J 9. Перед тем как запустить проект, необходимо сообщить VS, что новая Страница Default.aspx является именно той страницей, которую мы собираемся отлаживать. В Solution Explorer щелкните правой КНОПКОЙ МЫШИ На Default.aspx и выберите пункт Set as Start Page. Откомпилируйте и запустите проект как обычно. Вы увидите на экране выходной поток, подобный показанному на рисунке слева. Как это работает Мы создали новый проект и включили в него одну страницу. VS выполнил боль- шое количество скрытых от наших глаз действий. Однако в этой странице пока еще нет ничего активного — в ней присутствует только статический текст, который был введен. Познакомимся с тем, каким обра- зом можно включить в эту страницу активные элементы. Добавление активных элементов Если вам приходилось когда-нибудь создавать ASP-страницы или разрабаты- вать динамические web-страницы с использованием каких-либо конкурирующих технологий, то настала пора смело отбросить все, что, как вам кажется, вы знаете 684 Глава 24 о создании активных страниц. В ASP.NET используется подход, который в корне отличается от всего, с чем вам приходилось сталкиваться ранее. Учитывая тот факт, что Visual Basic оказался таким феноменально успешным, компания Microsoft предлагает использовать для создания web-приложений пара- дигму, аналогичную использовавшейся при создании приложений Windows Forms. Все строится вокруг управляющих элементов и регулируется событиями. Представьте себе, например, что есть приложение Windows, которое написано либо на VB, либо на С#. Если возникает желание добавить к этой форме какую- либо кнопку и заставить ее выполнять некоторые функции, то вы используете окно с инструментами, чтобы перенести требуемую кнопку в форму, затем дважды щел- каете на этой кнопке мышью, чтобы создать обработчик событий, и добавляете не- кий код. Такой подход к программированию является одновременно и основанным на использовании управляющих элементов, и регулирующимся событиями. Раньше в Паутине не существовало понятия управляющих элементов. Для все- го использовался обычный HTML. Если нужно было нарисовать кнопку, то выпол- няющемуся на стороне сервера сценарию приходилось отправлять HTML-запрос, чтобы заставить браузер вывести кнопку на экран. Если эта кнопка нажималась^ то браузеру приходилось снова посылать запрос странице, на этот раз включая в него дополнительную информацию о нажатии данной кнопки. В этом случае сер- верный сценарий мог бы среагировать на эту информацию и отправить какую-то новую или обработанную информацию обратно браузеру. При использовании .NET большая часть этих событий происходит за кулисами. Требуется только нарисовать кнопку в программе разработки Designer, a ASP.NET сам занимается превращением этого управляющего элемента в соответствующий HTML-текст и отправкой его браузеру, после чего браузер рисует его. Если про- исходит нажатие этой кнопки, то запрос отправляется обратно на сервер, однако мы можем зарегистрировать нажатие как событие, на которое мы в состоянии среаги- ровать. В этом разделе мы увидим, как все это работает на практике. Практикуй: добавление элемента с сообщением о копирайте 1. Если проект активен, завершите его, закрыв окно Internet Explorer. 2. Выберите пункт меню View | Design. Чтобы добавлять на страницу активные элементы, мы должны обязательно находиться в режиме Design View. З.Для упрощения вывода управляющих элементов выберите в меню пункт View | Details. Вы увидите что-то, подобное показанному на рисунке слева. Defaultaspx* Q^>CoP5 ; я ,-.-. • :. I i^DisraeK's Weblog ri^it© Wrox Press HTMLV;). •"/ '/' t \ 2001 4 3 > X d 4. Выберите и удалите сообщение о копирайте. 5. Воспользовавшись окном с инструментами, перенесите мышью управляющий элемент Label и поместите его между двумя тегами div, которые до этого обрамляли сообщение о копирайте. Вы увидите нечто похожее на показанное на рисунке справа. - ,,4..K...\t.: !: Weblog 4JH^LJ -I . .._,.„ ..._, . ^ Приложения ASP.NET 685 Маленькое окошко с символами > означает, что созданный тег вообще не является HTML-тегом. Этот тег понятен только для ASP.NET, поэтому он изображается в виде <?>. (Возможно, вы считаете, что компания Microsoft должна была предусмотреть вывод в этом месте маленькой иконки, которая обозначала бы данный управляющий элемент; вполне вероятно, что в следующей версии это будет реализовано именно таким образом!) 6. Важным понять, что концептуально управляющий элемент WebForms Label ничем не отличается от управляющего элемента Windows Forms Label, которым вы уже умеете пользоваться. В окне Properties выбранного вами управляющего элемента вы видите его свойства, в которые можно вносить изменения. Этим мы сейчас и займемся: • Присвойте СВОЙСТВУ ID Значение labelCopyright • Присвойте СВОЙСТВУ Text Значение (copyright) 7. Щелкните мышью два раза на странице. Концептуально это то же самое, что и двойной щелчок мышью на форме Windows и приводит к точно таким же результатам! В результате создается обработчик событий, который будет вызываться при загрузке страницы. 8. Введите Следующий КОД В меТОД Page_Load(): private void Page_Load(object sender, System.EventArgs e) i ••// Какой сейчас год? i n t y e a r = D a t e T i m e . N o w . Y e a r ; ..:..••••••.•,•.•,.•.• if (year == 2001} labelCopyright.Text = "Copyright © Disraeli " + year; else labelCopyright.Text = "Copyright © Disraeli 2001-" + year; Откомпилируйте и запустите проект. (Нельзя щелкнуть правой кнопкой мыши на редакторе кода и выбрать пункт меню View in Browser. Вам придется запустить код так, как вы делали это ранее.) Вы увидите, что никаких изменений не прои- зошло (см. рис. справа). 1 ' ! http://rocalhost/Webloo/Default.« Fife Edit Vizw Favorite* Tools Help Disraeli's Weblog Copyright ©Disraeli 2001 Щ ht^://ioc3fho$yWeblog/Defaultaspx • Local intranet Л ОЧЕНЬ ВАЖНО! Если вы используете программу Outlook или какую-либо другую программу, которая работает с датами, ЗАКРОЙТЕ ЕЕ! ЪАъ\ собираемся перевести системные часы вперед, и если вы не хотите, чтобы вам немедленно были выведены все напоминания за ближайшие двенадцать месяцев, то лучше закрыть эту программу. Это касается также и других приложений, чувствительных к изменениям даты; если вы не уверены, как они поведут себя при изменении даты, то закройте и их. 686 Глава 24 Disraeli's Weblog Copyright ©Disraeli 2001-2002 Теперь переведите ваши системные часы на один год вперед. Обновите страницу. Вы увидите картину, подобную представлений на рисунке слева. Как это работает То, что мы сделали, подтверждает факт, что сообщение о копирайте является дина- мическим. Когда страница создается, она ИСПОЛЬЗует метод DateTime.NowO ДЛЯ ПОЛу- чения текущей даты и вносит соответству- ющие изменения в сообщение о копирайте. Но каким образом активный элемент попал на страницу? Чтобы понять это, откройте редактор HTML для данной страницы. Переместившись немного вниз, вы сможете обнаружить следующий тег: <%@ Раде 1апдиаде=ис#п Codebehind=nDefault.aspx.es" AutoEventWireup="false" Inherits=Weblog.CDefault" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN* > <html> <head> <meta name ="GENERATOR" Content="Microsoft Visual Studio 7.0"> <meta name ="CODE_LANGUAGE" Content="C#"> <meta name = "vs__defaultClientScript" Content="JavaScript (ECMAScript)"> <meta name ="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </head> <body> <form id="Default" method=llpost11 runat="server"> <div> Disraeli's Weblog <br> <diy> <asp: Label id="labelCopyright11 runat="server">(copyright)<asp:Label> </form> </body> </html> Когда приходит запрос на .aspx-страницу, ASP.NET просматривает всю стра- ницу целиком, прежде чем предпринимать какие-либо действия. При этом выяв- ляется, какие составные части страницы являются неизменяемыми, а какие — динамическими. В приведенном выше примере кода выделен тег <asp:Labei>. ASP.NET знает, что этот тег является активной частью страницы. В результате исключения устанавливается, что оставшаяся часть страницы неизменяемая. В конечном счете, для ASP.NET необходимо, чтобы вся страница была неизме- няемой, поэтому основная роль ASP.NET заключается в превращении динамиче- ских элементов страницы в неизменяемый HTML. Большинство современных web- браузеров ограничены в своих возможностях. Основной подход ASP.NET заключа- ется в том, чтобы провести большую часть обработки на сервере и вернуть назад HTML, который может быть выведен браузером. В отдельных случаях ASP.NET допускает отправку браузеру некоторого кода, который должен быть им выполнен. Вероятнее всего, в течение последующих нескольких лет все большая и большая часть работы будет выполняться именно браузером, однако на сегодняшний денк Приложения ASP.NET 687 мы предпочитаем, чтобы все выполнялось на сервере, что и происходит в приве- денной программе. Посмотрим еще раз на код ASP.NET: <div> <asp:Label id=lllabelCopyright" runat="server"> (copyright) <asp:Label> Такой код фактически получает IE: I <div> <span id="labelCopyright">Copyright © Disraeli 2001-2002</span> :——*~ 1 При создании страниц ASP.NET с помощью Visual 'L™J Studio.NET, мы по умолчанию используем модель, в кото- рой страница кодируется в двух составляющих. Первая — это .aspx-файл, в котором хранится шаблон данной страницы и определяется, в каком именно месте у страницы могут появиться активные элементы. Вторая часть представляет собой файл с расширением .cs или .vb, в котором содержится код обработчика события (см. рис. слева). Когда производится двукратный щелчок мышью на странице для получения доступа к обработчику события Load, мы фак- тически открываем новый файл. Исходный файл на С#, известный под названием файла с кодом поддержки, ис- пользует то же имя, что и файл с расширением . aspx, и неразрывно с ним связан. В нем содержится определение класса, который является производным от класса System.Web.UI.Page. /// <summary> /// Краткое описание класса CDefault. ///</summary > public class CDefault : System.Web.UI.Page ASP.NET автоматически добавляет префикс "С" (от английского слова "class") к имени класса, чтобы уменьшить вероятность конфликтов между именами. Данный класс вызывает событие Load, которое исполняется при загрузке стра- ницы. Это происходит после того, как ASP.NET загрузил файл ,aspx и исследовал его с целью выяснения того, какие динамические элементы имеются на станице. Представляет интерес и следующий момент. Каждый динамический элемент, определенный на странице, существует также как защищенный член класса. Мы изменили свойство ID у управляющего элемента на labeicopyright, и именно это является членом, определенным на форме: ///summary /// Краткое описание класса CDefault. /// </summary> public class CDefault : System.Web.UI.Page { protected System.Web.Ul.WebControls.Label labelCopyright; Это еще одна классическая иллюстрация того, насколько на самом деле Web- Forms и Windows Forms похожи друг на друга. Когда мы рисуем управляющий элемент в форме Windows, то происходит добавление аналогичного члена. После того как он размещен, мы получаем возможность осуществлять к нему доступ программным путем: 688 Глава 24 private void Page_Load(object sender, System.EventArgs e) { // какой сейчас год? int year = DateTime.Now.Year; if (year == 2001) labelCopyright.Text = "Copyright © Disraeli • + year; else . labelCopyright.Text = "Copyright © Disraeli 2001-" + year; } Здесь ASP.NET загрузил .aspx-файл и осуществил поиск динамических элементов. Тем самым ASP.NET имеет в памяти образ страницы в коде HTML с включенны- ми в этот код маркерами в тех местах, где он нашел активный элемент. После это- го ASP.NET предоставляет странице и ее управляющим элементам возможность заменить маркеры на их HTML-код. Присваивая значение Text управляющему элементу Label, мы сообщаем этому элементу, что, когда ASP.NET запросит вставку HTML-кода на место маркера в образе страницы, где зарезервировано для него место, управляющий элемент Label выдаст следующий HTML-код: <span id=nlabelCopyrightII>Copyright fccopy; Disraeli 2001-2002</span> Другими словами, он возьмет значение, которое хранится в свойстве Text, и за- ключит его в теги <span>. Поэтапно ASP.NET определит, что все управляющие элементы предоставили свои HTML-коды, составляющие ту часть страницы, за которую они отвечают, и отправит законченный HTML-образ браузеру, который выведет его на экран.
|