Программирование в IIS

Веб-формы ASP.NET

Разбить на страницы
Показывать лекцию целиком

ASP.NET предлагает самый современный набор инструментов и технологических решений для разработки расширяемых веб-приложений. Редактором для программирования на базе ASP.NET является Visual Studio .NET. Приложения ASP.NET могут создаваться на различных языках программирования. Как правило, это языки Visual Basic и C#, и в данной лекции мы будем работать с языком C#.

Visual Basic представляет собой популярный язык программирования для разработки программ на платформе Microsoft. Компания Microsoft расширяла возможности и опции языка Visual Basic до выпуска шестой версии без ущерба обратной совместимости. Версия 7 пакета Visual Basic поставляется с Visual Studio .NET; поддержка наследственности версий языка в ней упразднена. Фрагмент кода VB6 невозможно скомпилировать в Visual Basic .NET (версия 7). Visual Basic .NET имеет мощные функциональные возможности, например, реальное наследование, что делает его настоящим языком объектно-ориентированного (ОО) программирования.

Следует отметить, что стили языков C++, Java и JavaScript оказывают сильное влияние на сообщество веб-программистов, поэтому в качестве языка программирования для интернета нужен язык с похожим стилем. Язык С#, новый язык от Microsoft в пакете Visual Studio .NET, обладает преимуществами языков типа C++ и Java, устраняя их недостатки. Итак, язык C# будет использоваться в данной лекции для демонстрации разработки веб-форм ASP.NET.

Программистам VB потребуется изучить синтаксис нового языка и некоторые элементы его архитектуры для перехода к работе со средой разработки Visual Studio .NET Integrated Design Environment (IDE), и работа с языком C# расширит навыки программирования. Язык C# специфичен для технологии Microsoft, то же самое можно сказать и о Visual Basic. Тем не менее, C# соответствует конвенции, знакомой разработчикам, программирующим на Java.

Обзор архитектуры интернет-форм

Расширением файла страницы веб-формы ASP.NET является .aspx, и в этой лекции такой тип файлов называется ASPX. Каждая веб-форма ASP.NET имеет связанный с ней класс. Классы файла ASPX содержатся в файле кода формы, который называется Codebehind. Имя файла Codebehind указывается следующим образом: <имя_файла>.aspx.<расширение_языка>, где <имя_файла> – имя файла ASPX, <расширение_языка> – двухсимвольное расширение, отражающее язык файла Codebehind. Если файл ASPX называется Webform.aspx, то файл Codebehind имеет вид Webform.aspx.cs для языка C# и Webform.aspx для языка Visual Basic. Файл ASPX содержит визуальные элементы веб-формы, а файл Codebehind содержит логику, согласно которой эта форма функционирует. Все файлы Codebehind компилируются в динамически подключаемые библиотеки (DLL), отгружаемые на сервер вместе с соответствующими страницами ASPX. Библиотеке DLL проекта по умолчанию присваивается имя проекта.

При запросе ASPX в IIS страница обрабатывается посредством расширения ISAPI ASP.NET aspnet_isapi.dll. Технология .NET генерирует еще одну временную библиотеку DLL на основе ASPX во время первого запроса файла. Эта DLL содержит класс, наследуемый от соответствующего класса веб-формы, сгенерированного в файле Codebehind, и располагается в библиотеке DLL проекта (см. рис. 2.1).

Такая система существенно обобщает бизнес-логику и логику представления по сравнению с абстракцией, предлагаемой архитектурой ASP. Файл Codebehind содержит бизнес-логику, а ASPX – логику представления веб-формы.

(рис 2.1) Обзор архитектуры веб-форм ASP.NET

Возможности этих двух файлов усиливают уровень абстракции логики представления и бизнес-логики. Файлы ASPX – это файлы XML, содержащие элементы HTML и элементы управления серверной части для создания HTML. Программист может внедрять бизнес-логику в файлы ASPX, но на это ему придется затратить дополнительные усилия. Файлы Codebehind – это файлы с кодом, и разместить в них логику представления гораздо сложнее, чем использовать файлы ASPX. В ASP абстракция бизнес-логики и логики также представляет собой сложный процесс, поэтому в ASP логика представления и бизнес-логика объединяются при разработке программного решения.

Начало работы с Visual Studio .NET

Откройте Visual Studio .NET. Вы увидите начальную страницу, если ее отображение разрешено. Как и в предыдущей версии Visual Studio, по умолчанию предоставляется шаблон проекта (эту возможность можно отключить). Создадим новый проект веб-форм ASP.NET.

  • Нажмите на кнопку New Project (Создать проект) в окне шаблона проекта, чтобы открыть окно New Project (Создание проекта) с перечнем типов проектов и соответствующими шаблонами.
  • В списке слева выберите Visual C# Projects (Проекты Visual C#) – справа отобразятся шаблоны проектов, соответствующие C#.
  • Выберите шаблон проекта ASP.NET Web Application (Веб-приложение ASP.NET).
  • Введите свое имя проекта, отличное от имени в текстовом поле. Укажите имя сервера, задав URL (см. рис. 2.2) или путь UNC к корневому веб-каталогу. В URL укажите имя сервера по умолчанию localhost, если разрабатываемое программное решение располагается на рабочей станции во время написания кода и модульного тестирования. В нашем примере указано имя SimpleWF.
  • Нажмите на кнопку OK. Vusual Studio .NET подключится к несущему серверу и сгенерирует файлы проекта. Visual Studio.NET вносит изменения на веб-сервере через порт 80, создавая новый виртуальный каталог, связанный с файловым каталогом, в котором находятся файлы проекта веб-формы. Если на порте 80 отсутствует веб-сервер IIS, или если IIS не работает, то Visual Studio .NET не сможет сгенерировать проект веб-приложения.
  • (рис 2.2) Присвоение имени проекту веб-приложения ASP.NET SimpleWF

    При успешном подключении Visual Studio .NET к серверу, указанному в окне New Project (Создание проекта), по умолчанию генерируются следующие файлы:

  • AssemblyInfo.cs ;
  • Global.asax ;
  • Global.asax.resx ;
  • SimpleWF.csproj ;
  • SimpleWF.csproj.webinfo ;
  • SimpleWF.vsdisco ;
  • Web.Config ;
  • WebForm1.aspx ;
  • WebForm1.aspx.cs ;
  • WebForm1.aspx.resx.
  • После создания веб-формы на узле редактор отобразит пустую веб-форму с именем WebForm1, готовую для редактирования (см. рис. 2.3).

    Для редактирования веб-форм в Visual Studio .NET используется дизайнер веб-форм (Web Forms Designer). Он позволяет переходить из представления формы в представление HTML для отображения кода XML и HTML с помощью кнопки HTML в левом нижнем углу окна веб-формы.

    (рис 2.3) Веб-форма в представлении Design (Дизайн) дизайнера веб-форм

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

    Файл веб-формы – ASPX

    Файл ASPX является отображаемым файлом веб-приложения ASP.NET. Конечный пользователь запрашивает его в своем веб-браузере для реализации функциональных возможностей веб-приложения ASP.NET. Если конечному пользователю нужно просмотреть веб-форму этого файла из IIS, необходимо выполнить запрос из веб-браузера по адресу http://<URL_моего_узла>/<мой_виртуальный_веб-каталог>/WebForm1.aspx, введя его в адресной строке.

    Создаваемому виртуальному каталогу по умолчанию присваивается имя проекта. Все веб-приложения ASP.NET генерируют виртуальный веб-каталог при установке в IIS. Файлы WebForm1.aspx.cs и WebForm1.aspx.resx используются для создания проектной библиотеки DLL – результата компиляции файла WebForm1.aspx. Файл aspx.cs называется кодом реализации файла ASPX, а файл ASPX – главным файлом. Файл aspx.cs содержит весь код, реализующий ASPX, а aspx.resx представляет собой файл-источник веб-формы.

    В листинге 2.1 показано представление HTML файла ASPX веб-формы ASP.NET. В нем можно изменять код HTML и сценарий javascript клиентской части, однако с помощью элементов управления веб-формы ASP.NET в представлении Design (Дизайн) вы создадите сложную веб-страницу без написания кода HTML. Представление Design (Дизайн) дизайнера веб-форм является редактором типа WYSIWIG ("что вижу на экране, то и получаю при печати"), абстрагирующим разработчика от кода HTML и дающим возможность наглядного построения веб-сраниц (по аналогии со средой IDE для приложений рабочего стола в Visual Basic 6). Если вам больше нравится программировать вручную, используйте область HTML-инструментария для получения элементов HTML.

    <%@ Page language="c#" Codebehind="requestSomething.aspx.cs" AutoEventWireup="false" Inherits="SimpleWF.requestSomething" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
      <HEAD>
       <title>requestSomething</title>
      <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
      <meta name="CODE_LANGUAGE" Content="C#">
      <meta name="vs_defaultClientScript" content="JavaScript">
      <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
      </HEAD>
      <body MS_POSITIONING="GridLayout">
       <form id="requestSomething" method="post" runat="server">
        <asp:TextBox id="txtYourself" style=
         "Z-INDEX: 101; LEFT: 193px; POSITION: absolute; 
         TOP: 46px" runat="server" Width="330px" 
         Height="25px">
        </asp:TextBox>
        <asp:Label id="Label1" style=
         "Z-INDEX: 102; LEFT: 26px; POSITION: absolute; 
          TOP: 41px" runat="server" Width="155px" 
          Height="43px">
          Tell me about yourself and click submit:
        </asp:Label>
        <asp:TextBox id="txtResponse" style=
         "Z-INDEX: 103; LEFT: 57px; POSITION: absolute; 
          TOP: 148px" runat="server" Width="435px" 
          Height="101px" ReadOnly="True" 
          TextMode="MultiLine">
        </asp:TextBox>
        <asp:Button id="Button1" style=
         "Z-INDEX: 104; LEFT: 298px; POSITION: absolute; 
          TOP: 79px" runat="server" Width="131px" 
          Height="43px" Text="Submit">
        </asp:Button>
        <asp:Label id="Label2" style=
         "Z-INDEX: 105; LEFT: 66px; POSITION: absolute; 
         TOP: 116px" runat="server" Width="138px" 
         Height="27px">You Said:
        </asp:Label>
       </form>
      </body>
    </HTML>

    Первая строка requestSomething.aspx определяет файл Codebehind с именем requestSomething.aspx.cs. Global.asax использует такие же правила именования файлов, что и файл requestSomething.aspx, обращаясь к файлу Global.asax.cs. Назначение файла Global.asax такое же, как в ASP – обеспечить место расположения для записи кода, доступное веб-формам рассматриваемого проекта, которое позволит разработчику фиксировать события, связанные с приложением. Например, в ASP файл Global.asa обеспечивает запуск и остановку приложения, открытие и закрытие сеанса; файл Global.asax предоставляет класс Global, наследующий System.Web.HttpApplication и содержащий функции, связанные с этими событиями. Кроме того, Global.asax предоставляет события начала и завершения запроса на ресурсы, процесса аутентификации и ошибок приложения.

    Веб-форма requestSomething.aspx содержит три элемента управления. Они добавлены из области Web Forms (Веб-формы). В дизайнере веб-форм можно добавлять элементы управления в веб-форму, как при создании приложения рабочего стола в Visual Basic или в Visual C++. Интерфейс элементов управления практически такой же.

    Разработчики создают код веб-форм так же, как они программируют классы форм в Visual Basic или Visual C++. Представление свойств элемента управления имеет формат XML и располагается в файле ASPX. Технология .NET использует XML для инициализации нужного элемента управления и создания кода HTML, возвращаемого потребителю. Инструментарий Visual Studio .NET позволяет разработчикам выбирать элементы HTML. Например, элементы DataGrid и таблица HTML реализуют отображение таблицы в веб-браузере. Элемент управления веб-формы DataGrid дает более обширное программное управление заполнением и конфигурацией таблицы по сравнению с элементом таблицы HTML. В листингах 2.2 и 2.3 показаны различия между элементом управления веб-формы DataGrid и элементами HTML. В листинге 2.2 приведен код XML, размещенный в файле ASPX и представляющий собой элемент управления DataGrid.

    <asp:DataGrid id="DataGrid2" 
    style="Z-INDEX: 104; LEFT: 88px; POSITION: absolute; TOP: 258px"
    runat="server">
    </asp:DataGrid>

    В листинге 2.3 показан элемент HTML, созданный при вставке таблицы из области HTML-инструментария в веб-форму.

    <TABLE id="Table1" style="Z-INDEX: 103; LEFT: 191px; 
    POSITION: absolute; TOP: 291px" cellSpacing="1" 
    cellPadding="1" width="300" border="1">
      <TR>
       <TD></TD>
       <TD></TD>
       <TD></TD>
      </TR>
      <TR>
       <TD></TD>
       <TD></TD>
       <TD></TD>
      </TR>
      <TR>
       <TD></TD>
       <TD></TD>
       <TD></TD>
      </TR>
    </TABLE>

    В простейшей веб-форме requestSomething.aspx (см. рис. 2.4) пользователь может ввести некоторую личную информацию и нажать на кнопку Submit (Отправить). После отправки веб-формы он получает ответ в виде содержимого, введенного им в текстовом поле с именем Tell Me About Yourself And Click Submit (Расскажите о себе и нажмите на кнопку Submit [Отправить]), а также в поле You Said (Вы сказали). На рисунке 2.4 показана форма requestSomething.aspx после отправки информации на сервер.

    (рис 2.4) Веб-форма requestSomething.aspx в действии

    Файл Codebehind веб-формы – aspx.cs

    В классическом ASP разработчик размещает в файле ASP код для извлечения данных, отправленных пользователем. После извлечения данных из объекта Request они располагаются в атрибуте значения другого текстового поля, отображающего отправленную пользователем информацию. В файле ASP нужный результат достигается в строке кода:

    <textarea name="txtResponse" ><% =Request("txtYourself") %>
    </textarea>

    В веб-форме ASP.NET требуется разработка большего объема кода, но с более высоким уровнем организации. В листинге 2.4 приведен код веб-формы requestSomething.aspx в файле requestSomething.aspx.cs. Дизайнер веб-форм автоматически генерирует большую часть кода, приведенного в листинге 2.4. При открытии файла requestSomehing.aspx в представлении Design (Дизайн) и двойном щелчке на элементе управления верхнего текстового поля txtYourself дизайнер веб-форм создаст событие в файле requestSomething.aspx.cs с именем txtYourself_TextChanged. Дизайнер веб-форм откроет файл requestSomething.aspx.cs для получения функции события, созданной для элемента управления txtYourself. Несмотря на то, что дизайнер веб-форм генерирует большую часть кода в файле Codebehind, этот код при желании можно редактировать вручную.

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    namespace SimpleWF
    {
      /// <summary>
      /// Summary description for requestSomething.
      /// </summary>
      public class requestSomething : System.Web.UI.Page
      {
       protected System.Web.UI.WebControls.Button Button1;
       protected System.Web.UI.WebControls.TextBox txtYourself;
       protected System.Web.UI.WebControls.TextBox txtResponse;
       protected System.Web.UI.WebControls.Label Label2;
       protected System.Web.UI.WebControls.Label Label1;
      
       private void Page_Load(object sender, System.EventArgs e)
       {
        // Put user code to initialize the page here
       }
       #region Web Form Designer generated code
       override protected void OnInit(EventArgs e)
       {
        //
        // CODEGEN: This call is required by the 
        // ASP.NET Web Form Designer.
        //
        InitializeComponent();
        base.OnInit(e);
       }
       
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       { 
        this.txtYourself.TextChanged += new
        System.EventHandler(this.txtYourself_TextChanged);
    
        this.Load += new 
        System.EventHandler(this.Page_Load);
       }
       #endregion
       private void txtYourself_TextChanged 
          (object sender, System.EventArgs e)
       {
        this.txtResponse.Text = this.txtYourself.Text;
       }
      }
    }

    Обработчик события веб-формы вызывается при изменении и отправке на веб-сервер значения txtYourself в форме. После отправки формы серверу файл Codebehind веб-формы requestSomething.aspx определяет, что отправлено значение текстового поля txtYourself и вызывает функцию события txtYourself_TextChanged. В нашем примере для размещения значения, отправленного в текстовое поле txtResponse, создана единственная строка кода:

    this.txtResponse.Text = this.txtYourself.Text;

    Оба текстовых поля воспринимаются как элементы управления или экземпляры классов в обычном программном приложении, полностью абстрагируя программиста от деталей HTML. Так как программист может вставлять элементы управления в представлении Design (Дизайн) и изменять код, связанный с действием элемента управления, щелкнув на этом элементе, он практически полностью избавляется от редактирования кода HTML.

    Файл AssemblyInfo.cs

    Проект ASP.NET с именем SimpleWF создает библиотеку – установочный пакет для файлов веб-формы, из которых состоит проект; эта библиотека является обычной DLL. Библиотека создается при первом запросе файла ASPX из IIS. Файл Codebehind и файл источника, ссылки на которые содержатся в файле ASPX, компилируются в языке инструкций Microsoft (MISL). Формат этого языка аналогичен коду библиотеки в отличие от двоичных продуктов других компиляторов. MISL создается только для исполняемых подпрограмм кода.

    Файлы AssemblyInfo.cs, SimpleWF.csproj, SimpleWF.csproj.webinfo и SimpleWF.vsdisco поставляют компилятору необходимую информацию для создания библиотеки, содержащей код MISL, сгенерированный из файлов ASP.NET. Информация в файле AssemblyInfo.cs представляет собой описание библиотеки, например, ее версию и имя. Этот файл можно использовать для подписи библиотек посредством присвоения ключа, который является механизмом защиты библиотеки от реинжиниринга. В листинге 2.5 приведен код пустого файла AssemblyInfo.cs. Файл библиотеки можно редактировать напрямую, и для этого не требуется высокого уровня знаний. Укажите известные значения, оставив другие значения незаполненными.

    using System.Reflection;
    using System.Runtime.CompilerServices;
    [assembly: AssemblyTitle("")]
    [assembly: AssemblyDescription("")]
    [assembly: AssemblyConfiguration("")]
    [assembly: AssemblyCompany("")]
    [assembly: AssemblyProduct("")]
    [assembly: AssemblyCopyright("")]
    [assembly: AssemblyTrademark("")]
    [assembly: AssemblyCulture("")]
    [assembly: AssemblyVersion("1.0.*")]
    [assembly: AssemblyDelaySign(false)]
    [assembly: AssemblyKeyFile("")]
    [assembly: AssemblyKeyName("")]

    Файл проекта – csproj

    Файл csproj является файлом XML и содержит информацию о зависимостях проекта и некоторых параметрах компиляции библиотеки. Visual Studio .NET обновляет этот файл по мере добавления или удаления из проекта веб-форм и ссылок. Не следует изменять файл csproj при обычной работе с проектом ASP.NET. При открытии файла в браузере отображается информация обо всех параметрах и элементах, составляющих проект: имена файлов, параметры реализации и ссылки библиотеки и т.д.

    Файл проекта WebInfo – csproj.webinfo

    Файл csproj.webinfo представляет собой файл XML и описывает расположение файла проекта. В листинге 2.6 приведено содержание файла SimpleWF.csproj.webinfo. Он также генерируется и обновляется Visual Studio. .NET, и его не следует редактировать напрямую.

    <VisualStudioUNCWeb>
     <Web URLPath = "http://amd1700/SimpleWF/SimpleWF.csproj" />
    </VisualStudioUNCWeb>

    Файл информации о поиске – vsdisco

    Файл vsdisco определяет пути поиска на сервере разработки, что дает ASP.NET возможность нахождения веб-служб ASP.NET. Файл SimpleWF.vsdisco генерируется для проекта SimpleWF по умолчанию. В листинге 2.7 приведен исходный код файла SimpleWF.vsdisco. Для упрощения поиска ASP.NET других библиотек в среде разработки следует отредактировать файл vsdisco, указав в нем веб-каталоги, в которых не нужно осуществлять поиск. В версии vsdisco по умолчанию исключаются папки расширения FrontPage, так как обычно библиотеки в этих папках не содержатся.

    <?xml version="1.0" encoding="utf-8" ?>
    <dynamicDiscovery xmlns=
         "urn:schemas-dynamicdiscovery:disco.2000-03-17">
      <exclude path="_vti_cnf" />
      <exclude path="_vti_pvt" />
      <exclude path="_vti_log" />
      <exclude path="_vti_script" />
      <exclude path="_vti_txt" />
      <exclude path="Web References" />
    </dynamicDiscovery>

    Файл веб-конфигурации – web.config

    Файл web.config представляет собой файл конфигурации IIS. Программист использует его для настройки IIS на определенную работу в процессе разработки. Когда проект ASP.NET готов к реализации, сайт или виртуальный каталог IIS немедленно настраивается согласно этой конфигурации. Параметры файла web.config применяются ко всем папкам каталога, в котором расположен данный файл, если ни в одной из них не содержится другого файла web.config (в веб-приложении их может содержаться несколько). Если файл web.config отсутствует, то по умолчанию используется файл machine.config, расположенный в папке $:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG. Фрагмент пути v1.1.4322 отражает версию технологии .NET, используемой на сервере. В листинге 2.8 приведен файл по умолчанию web.config, созданный в проекте SimpleWF.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration> 
     <system.web> 
     <compilation
      defaultLanguage="c#"
      debug="true"
     /> 
     <customErrors
     mode="RemoteOnly"
     />
     <authentication mode="Windows" />
     <trace
      enabled="false"
      requestLimit="10"
      pageOutput="false"
      traceMode="SortByTime"
       localOnly="true"
     /> 
     <sessionState
       mode="InProc"
       stateConnectionString="tcpip=127.0.0.1:42424"
       sqlConnectionString=
          "data source=127.0.0.1;user id=sa;password="
       cookieless="false"
       timeout="20"
     /> 
     <globalization
       requestEncoding="utf-8"
       responseEncoding="utf-8"
     /> 
    </system.web>
    </configuration>

    Параметры приложения устанавливаются как дочерние элементы элемента appSettings, который, в свою очередь, является дочерним по отношению к элементу configuration. Файл web.config по умолчанию не содержит параметров приложения. Эти параметры обычно включаются динамическими свойствами элементов управления, добавленных в веб-формы в дизайнере веб-форм или введенных вручную. Параметры приложения содержат значения инициализации компонентов приложения. Об использовании файла web.config для хранения и извлечения параметров приложения более подробно рассказывается в лекции 3.

    Элемент system.web имеет дочерние элементы, содержащие параметры управления механизмом самого веб-приложения. При отсутствии дочерних элементов приложение использует параметры файла machine.config. Приведенный ниже список возможных параметров далеко не полон, однако формирующие этот список дочерние элементы элемента system.web по умолчанию присутствуют в файле web.config, созданном Visual Studio .NET:

  • compilation. Определяет параметры компиляции приложения по умолчанию;
  • customErrors. Определяет конфигурацию отчетов об ошибках;
  • authentication. Определяет используемый метод аутентификации;
  • trace. Определяет метод, согласно которому функционирует служба .NET Trace;
  • sessionState. Определяет функционирование сеанса и механизм для управления этим сеансом;
  • globalization. Определяет параметры набора символов, кодировки и настройки, связанные с культурой языка.
  • Построение веб-форм

    Отображение информации из базы данных в таблице HTML реализуется с помощью элемента управления веб-формы DataGrid. В представлении Design (Дизайн) выберите DataGrid в инструментарии и вставьте этот элемент в веб-форму. При отображении кода HTML вы имеете дело с представлением формы в HTML. На рисунке 2.3 изображена веб-форма в представлении Design (Дизайн).) После добавления в форму элемента DataGrid его можно переименовать в окне свойств. На рисунке 2.5 мы видим, что элементу DataGrid присвоено имя dgChair.

    (рис 2.5) Окно свойств элемента управления DataGrid

    Запуск веб-формы в Visual Studio .NET на данном этапе вызовет компиляцию веб-формы в библиотеку на сервере разработки. В нашем примере сервер разработки, на котором расположена веб-форма, называется amd1700. Для компиляции веб-формы и запуска ее в режиме отладки в Visual Studio .NET нажмите на клавишу F5. Visual Studio .NET скомпилирует веб-форму и перейдет в режим отладки аналогично тому, как это происходило в предыдущих версиях Visual Studio при запуске исполняемого файла Visual Basic или Visual C++.

    После завершения компиляции на рабочей станции откроется браузер с отображением веб-формы. Сервер разработки выполнит действия, необходимые для отображения веб-страницы, и браузер откроет пустую страницу. При закрытии браузера сеанс отладки завершится, и Visual Studio .NET вернется в режим редактирования. В данном упражнении отображается пустая страница, поскольку элемент DataGrid dgChair не содержит никаких данных. Для отображения элементом DataGrid данных нужно создать в файле Codebehind код, реализующий получение элемента DataSet и размещение данных в элементе управления dgChair.

    Изменение кода веб-формы, ориентированной на работу с данными

    Чтобы изменить файл Codebehind веб-формы с элементом dgChair, щелкните правой кнопкой мыши на файле веб-формы в Solution Explorer или правой кнопкой мыши на самом файле в представлении Design (Дизайн). Затем выберите View Code (Просмотреть код). По умолчанию Visual Studio .NET отображает в Solution Explorer не все файлы программного решения. Щелкните на значке Show All Files (Показать все файлы) в верхней части Solution Explorer для показа всех файлов, чтобы выбрать файл Codebehind.

    Файл Codebehind отобразится с директивами using для классов, необходимых для функционирования веб-формы, с пространством имен и структурой классов. Пространство имен носит то же имя, что и рассматриваемый проект. Имя класса совпадает с именем веб-формы. В листинге 2.9 приведен исходный код веб-формы showGrid. Веб-форма showGrid демонстрирует элемент управления DataGrid. Дизайнер веб-форм разместил защищенный элемент в классе showGrid, представляющий элемент dgChair, добавленный в веб-форму. Ссылка using System.Data.OleDb добавлена для простоты обращения к классам ADO.NET.

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Data.OleDb; //for the OleDbclasses
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    namespace SimpleWF
    {
      /// <summary>
      /// Summary description for showGrid.
      /// </summary>
      public class showGrid : System.Web.UI.Page
      {
       protected System.Web.UI.WebControls.DataGrid dgChair;
       private void Page_Load(object sender, System.EventArgs e)
       {
       }
       #region Web Form Designer generated code
       override protected void OnInit(EventArgs e)
       {
        //
        // CODEGEN: This call is required by the 
        // ASP.NET Web Form Designer.
        //
        InitializeComponent();
        base.OnInit(e);
       }
       
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       { 
        this.Load += new System.EventHandler
                (this.Page_Load);
       }
       #endregion
      }
    }

    Если вам нужно заполнить элемент dgChair данными из таблицы базы данных, то требуется получение набора данных ADO.NET DataSet с информацией из базы данных. Набор DataSet используется для заполнения элемента dgChair при запросе веб-страницы с веб-сервера. При загрузке страницы с веб-сервера вызывается событие Load объекта Page. Класс showGrid наследуется из System.Web.UI.Page, как видно из объявления класса в листинге 2.9, поэтому событие Load также наследуется из System.Web.UI.Page. При выполнении события Load происходит получение набора DataSet и заполнения элемента DataGrid. В листинге 2.10 приведена подпрограмма LoadGrid, реализующая заполнение элемента DataGrid набором DataSet.

    private void LoadGrid(DataGrid dg)
    {
      //set the connection credentials
      string DataSetName = "myChairs";
      string ConnectionString =
         "Provider=Microsoft.Jet.OLEDB.4.0;" + 
             "Data Source=C:\\aspData\\employees.mdb;"; 
    
      //make the DB connection
      OleDbConnection myConn = new
       OleDbConnection(ConnectionString);
    
      //make a data set to hold chairs
      DataSet myDataSet = new DataSet(DataSetName);
    
      //make a data adaptor
      OleDbDataAdapter myAdapt = new
       OleDbDataAdapter("Select * From tblChair", myConn);
    
      //fill the dataset
      myAdapt.Fill(myDataSet);
    
      //get a view in the dataset
      DataView myDataView = new DataView(myDataSet.Tables[0]);
    
      //show the data view in the Grid
      dg.DataSource = myDataView;
      dg.DataBind();
    }

    LoadGrid представляет собой функцию, входящую в класс showGrid. Функция вызывается посредством размещения следующего вызова в функции события Page_Load файла showGrid.aspx:

    LoadGrid(dgChair);

    Безопасность ASP.NET

    При загрузке страницы showGrid.aspx фиксируется событие Load и вызывается функция LoadGrid. При вызове функции LoadGrid устанавливается подключение к базе данных посредством строковой переменной и инициализируется объект подключения ADO Connection.

    Примечание. Следует отметить, что указывать символьные аргументы строки подключения в коде, как в листинге 2.10, крайне не рекомендуется. Это сделано, чтобы показать аутентификационные данные, используемые для подключения, а также метод их применения к объекту Connection. Рекомендуем получать аутентификационные данные, размещая строки подключения к базе данных в файле web.config (см. лекции 3).

    В листинге 2.10 используется источник данных Microsoft Access 2000. Чтобы веб-форма ASP.NET могла считывать и записывать информацию в файл базы данных Access, необходимо настроить файловые разрешения сервера для файлов данных Access ( .mdb ). При использовании базы данных корпоративного уровня, например, SQL Server или Oracle, для передачи аутентификационных данных серверу базы данных при ее запросе веб-формой ASP.NET возможно применение интегрированной безопасности. Аргумент integrated security=sspi в строке подключения к базе данных указывает использование интегрированной безопасности, и аутентификационные данные Windows .NET Server предоставляются источнику данных. Учетная запись пользователя Windows, используемая приложением ASP.NET, меняться в зависимости от следующих критериев.

  • Аутентификация осуществляется для приложения ASP.NET. Анонимная или не анонимная.
  • Используется режим изоляции IIS. Режим изоляции IIS 5.0 или режим изоляции рабочих процессов.
  • В зависимости от метода аутентификации в приложении IIS ASP.NET использует следующие учетные записи Windows.

  • Гостевая учетная запись Windows IIS для анонимного доступа. IUSER_<имя_компьютера>
  • Субъект пула приложения. Учетная запись Windows, определенная в пуле приложения. Учетными записями по умолчанию являются Network Service (Сетевая служба), Local Service (Локальная служба) и Local System (Локальная система).
  • Учетная запись Windows-аутентифицируемого пользователя, являющегося потребителем приложения. Аутентификационные данные, предоставленные пользователем при аутентификации приложения сервера ASP.NET.
  • Если IIS настроен на разрешение анонимного доступа к сайту, и для сервера установлен режим изоляции приложения по умолчанию (т.е. режим изоляции рабочих процессов), то ASP.NET использует субъект в пуле приложения, занятом веб-приложением. Если режим изоляции IIS 5.0 используется для обеспечения обратной совместимости, то субъектом пула приложения будет гостевая учетная запись IIS. Если приложение настроено на использование одного из режимов аутентификации, доступных в IIS и предусматривающих предоставление аутентификационных данных пользователем, то IIS по умолчанию использует в качестве субъекта аутентификационные данные. Субъекты, используемые по умолчанию приложением IIS, приведены в табл. 2.1.

    В рассматриваемом приложении (или в любом другом) возможны и другие субъекты доступа. Например, для авторизации доступа пользователя к приложению применяется аутентификация форм, и, в то же время, используется специальная учетная запись пользователя для выполнения всех запросов базы данных.

    Для веб-формы showGrid.aspx применяется режим изоляции рабочих процессов. Анонимный доступ будет разрешен, поэтому аутентификационными данными учетной записи Windows пула приложений станут входные данные, используемые для доступа к источнику информации. Для файла базы данных Microsoft Access файловые разрешения несущего сервера устанавливаются так, чтобы учетная запись Windows производила чтение, запись и изменение файла .mdb. Если речь идет о базе данный корпоративного уровня, то учетной записи Windows нужно предоставить соответствующий доступ к базе данных на сервере базы данных.

    Примечание. Следует помнить, что файл web.config содержит элемент authentication. Режимом элемента аутентификации по умолчанию является Windows. Так как многие программисты используют учетную запись группы администраторов, то впечатление о правильности параметров в форме ASP.NET может быть обманчивым, так как эта учетная запись наделена правами на выполнение практически любых действий в среде разработки. При перемещении приложения на тестовый или конечный сервер с ограниченными разрешениями доступа возможно, что веб-форма не будет функционировать.

    Субъекты по умолчанию для приложения ASP.NET
    АутентификацияРежим изоляции приложенияУчетная запись Windows, используемая ASP.NET
    Анонимная Изоляция IIS 5.0 IUSER_<имя_компьютера>.
    Анонимная Изоляция рабочих процессов Субъект пула приложения для веб-приложения.
    Не анонимная Изоляция IIS 5.0 Аутентификационные данные, предоставленные пользователем при проверке подлинности.
    Не анонимная Изоляция рабочих процессов Аутентификационные данные, предоставленные пользователем при проверке подлинности.

    Обзор технологии ADO.NET

    Для заполнения элемента dgChair данными из таблицы базы данных мы будем использовать ADO.NET, поэтому нужно добавить в файл showGrid.aspx пространство имен для классов данных, необходимых для доступа к источнику данных. Веб-формы по умолчанию содержат пространство имен System.Data, являющееся главным пространством имен ADO.NET. Другие пространства имен, подчиненные System.Data, поддерживают определенные типы источников данных. Стандартными пространствами имен, подчиненными System.Data, являются следующие.

    System.Data.Common.
    System.Data.OleDb.
    System.Data.SqlClient.
    System.Data.SqlTypes.

    Пространство имен SqlClient обеспечивает интерфейс к провайдеру SQL Server и наиболее эффективный способ связи с SQL Server 2000. Пространство имен System.Data.OleDb поддерживает интерфейс, аналогичный традиционной технологии ADO; оно неэффективно при подключении к SQL Server 2000. System.Data.Ole.Db рекомендуется для работы с источниками данных, отличными от SQL Server 2000, имеющими провайдера OLE-DB. Пространства имен System.Data.Common и System.Data.SqlTypes обеспечивают интерфейсы для SQL Server и общие интерфейсы между SQL Server и классами OLE-DB.

    ADO.NET поставляется в виде единственной библиотеки – System.Data.dll. Если необходима поддержка источника данных ODBC, Microsoft предлагает другую библиотеку (ее можно загрузить из интернета) для обеспечения пространства имен классов ODBC.

    Поскольку источником данных, рассматриваемым в примерах данной лекции, является Microsoft Acess 2000, то следует использовать пространство имен OleDb. Если источником данных является SQL Server 2000, то используется пространство имен SqlClient – это наиболее эффективный способ установки связи с SQL Server 2000. Вверху файла showGid.aspx необходимо вместе с остальными директивами пространства имен ввести следующую строку кода:

    using System.Data.OleDb; //for the OleDb classes

    Использование классов ADO.NET для заполнения элемента управления DataGrid

    После установки соединения выполняется запрос экземпляра набора данных ADO.NET myDataSet таблицы tblChairs базы данных. Набору данных DataSet при инициализации присваивается имя myChairs. Инициализируется объект ADO.NET Adaptor для заполнения экземпляра myDataSet. После этого инициализируется объект ADO.NET DataView с именем myDataView с использованием первой таблицы набора данных myDataSet. В итоге аргумент DataGrid с именем dg, переданный подпрограмме, устанавливает свойство источника данных на экземпляр DataView с именем myDataView, и вызывает метод DataBind аргумента dg для заполнения экземпляра dg элемента DataGrid данными из таблицы tblChairs.

    Использование класса DataView не является обязательным, если нужно отобразить весь набор данных DataSet. В элементе dg (см. листинге 2.10) отображается весь созданный набор данных DataSet, поэтому можно опустить следующую строку:

    DataView myDataView = new DataView(myDataSet.Tables[0]);

    Свойство DataSource элемента dg установим равным значению Tables[0] свойства набора данных myDataSet. Строку, присваивающую dg.DataSource источнику myDataView, изменим следующим образом:

    dg.DataSource = myDataSet.Tables[0]

    При нажатии на клавишу F5 будет скомпилирована страница showGrid.aspx, затем откроется окно браузера с отображением данных в таблице myChairs (см. рис. 2.6).

    (рис 2.6) Отображение результатов работы showGrid.aspx с использованием DataGrid

    Применение элемента управления DataList

    Помимо DataGrid для отображения информации из базы данных используются и другие типы элементов управления данными. Элемент управления DataList применяется для отображения данных в формате, отличном от табличной формы. В листинге 2.11 приведен исходный код файла datalist.aspx.cs, представляющий собой веб-форму, в которой элемент управления DataList заполняется данными с помощью набора ADO.NET Dataset.

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Data.OleDb; //for the OleDb classes
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    namespace SimpleWF
    {
      /// <summary>
      /// Summary description for datalist.
      /// </summary>
      public class datalist : System.Web.UI.Page
      {
       protected System.Web.UI.WebControls.DataList dlChair;
      
       private void LoadList(DataList dl)
       {
        //set the connection credentials
        string DataSetName = "myChairs";
        string ConnectionString =
         "Provider=Microsoft.Jet.OLEDB.4.0;" + 
       "Data Source=C:\\aspData\\employees.mdb;";
    
        //make the DB connection
        OleDbConnection myConn = new
         OleDbConnection(ConnectionString);
    
        //make a data set to hold chairs
        DataSet myDataSet = new DataSet(DataSetName);
    
        //make a data adaptor
        OleDbDataAdapter myAdapt = new
         OleDbDataAdapter("Select * From tblChair", myConn);
         
    
        //fill the dataset
        myAdapt.Fill(myDataSet);
    
        //show the data in the data list
        dl.DataSource = myDataSet;
        dl.DataBind();
       }
       private void Page_Load(object sender, System.EventArgs e)
       {
        LoadList(this.dlChair);
       }
       #region Web Form Designer generated code
       override protected void OnInit(EventArgs e)
       {
        //
        // CODEGEN: This call is required by the 
        // ASP.NET Web Form Designer.
        //
        InitializeComponent();
        base.OnInit(e);
       }
       
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       { 
        this.Load += new System.EventHandler(this.Page_Load);
       }
       #endregion
      }
    }

    DataList использует иной механизм построения DataSet, называемый шаблоном. Шаблон описывает способ отображения данных в элементе управления DalaList. Щелкните правой кнопкой мыши на DataList и выберите любую из опций редактирования шаблона в команде Edit Template (Изменить шаблон) контекстного меню. В шаблоне настраиваются заголовки или имена полей, определяющие отображение данных. В DataList присутствуют также верхние, нижние колонтитулы и названия. Для указания данных из определенного набора DataSet необходимо изменить шаблон в представлении HTML. Теги <%# и %> означают присоединение данных в странице веб-формы. В коде шаблона указываются поля присоединения данных. В листинге 2.12 приведен код файла datalist.aspx, отображаемый в представлении HTML.

    <%@ Page language="c#" Codebehind="datalist.aspx.cs" 
     AutoEventWireup="false" Inherits="SimpleWF.datalist" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
      <HEAD>
       <title>datalist</title>
      <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
      <meta name="CODE_LANGUAGE" Content="C#">
      <meta name="vs_defaultClientScript" content="JavaScript">
      <meta name="vs_targetSchema"
       content="http://schemas.microsoft.com/intellisense/ie5">
      </HEAD>
      <body MS_POSITIONING="GridLayout" bgColor="#ffffff">
       <form id="datalist" method="post" runat="server">
        <asp:DataList id="dlChair" style=
         "Z-INDEX: 102; LEFT: 18px; POSITION: absolute;
          TOP: 34px" runat="server" Height="301px" 
          Width="316px">
         <ItemTemplate>
         <DIV style="PADDING-RIGHT: 15px; 
            PADDING-LEFT: 15px; PADDING-BOTTOM: 
            15px; FONT: 12pt verdana; 
            COLOR: black; PADDING-TOP: 15px" 
            align="left">ID:</DIV>
         <%# DataBinder.Eval(Container.DataItem, "ID")%>
         <DIV style="PADDING-RIGHT: 15px; PADDING-LEFT: 
           15px; PADDING-BOTTOM: 15px; 
           FONT: 12pt verdana; 
           COLOR: black; PADDING-TOP: 15px" 
           align="left">Color:</DIV>
         <%# DataBinder.Eval(Container.DataItem, "Color")%>
         </ItemTemplate>
        </asp:DataList>
       </form>
      </body>
    </HTML>

    DataList определяется элементами HTML <asp:DataList>. Внутри тегов элемента DataList располагаются теги шаблона, определяемые тегом <ItemTemplate>. Свойства шаблона в дизайнере веб-форм генерируют теги внутри тегов <ItemTemplate>, однако их можно отредактировать вручную в представлении HTML. Теги присоединения данных можно стратегически расположить внутри шаблона в тех местах, где должны отображаться соответствующие поля набора данных DataSet. В листинге 2.12 приведены два поля из отображаемого набора DataSetID и Color. Тег присоединения для поля ID имеет вид <%#DataBinder.Eval(Container.DataItem, "ID")%>, а тег присоединения поля Color<%#DataBinder.Eval(Container.DataItem, "Color")%>.

    При запуске datalist.aspx сгенерирован тот же набор DataSet, как в примере с элементом DataGrid (см. рис. 2.6). Однако формат данных отличается от предыдущего примера (см. рис. 2.7), поскольку данные отформатированы по шаблону, приведенному в листинге 2.12.

    (рис 2.7) Результат работы файла datalist.aspx, полученный при помощи шаблона для форматирования набора DataSet

    Мастер форм данных

    Дизайнер веб-форм содержит мастер для создания форм, отображающий наборы данных из источника. Для работы с мастером форм данных (Data From Wizard) выполните следующие действия.

  • В Solution Explorer щелкните правой кнопкой мыши и выберите Add New Item (Добавить новый элемент).
  • В диалоговом окне Add New Item (Добавление нового элемента) вы увидите большое количество типов файлов, которые можно добавить в проект – они отображаются в правой панели. Разверните дерево каталогов слева, и вы увидите дочерние элементы дерева, представляющие собой категории, при выборе которых изменяется набор отображаемых в правой панели элементов.
  • Выберите Data Form Wizard (Мастер форм данных) и введите имя файла (см. рис 2.8(рис 2.8) Выбор мастера форм данных (Data Form Wizard)
  • Нажмите на кнопку Open (Открыть), и в Visual Studio .NET будет создана новая веб-форма. В нашем примере она называется employees.aspx.
  • Откроется мастер форм данных с окном приветствия, информирующим о предстоящих действиях. Нажмите на кнопку Next (Далее).
  • В окне Choose The Dataset You Want To Use (Выберите нужный набор данных) мастер предложит выбрать имеющийся набор данных либо создать новый набор DataSet. В данном примере создан набор DataSet с именем dsEmps (см. рис. 2.9). Все наборы DataSet, создаваемые в мастере, становятся элементами проекта и могут использоваться другими веб-формами или веб-службами внутри этого проекта. Файл DataSet имеет расширение (рис 2.9) Окно Choose The Dataset You Want To Use (Выберите нужный набор данных) мастера форм данных (Data Form Wizard)
  • Нажмите на кнопку Next (Далее) для перехода в окно Choose A Data Connection (Выберите подключение к данным) (см. рис. 2.10). В ниспадающем списке показаны соединения, созданные в проекте до этого. Вы можете выбрать имеющееся подключение либо создать новое. В нашем примере выбрано подключение (рис 2.10) Окно Choose A Data Connection (Выберите подключение к данным) мастера форм данных
  • Нажмите на кнопку New Connection (Новое подключение) для открытия окна Data Link Properties (Свойства подключения к данным), в котором настраивается новое подключение к базе данных.
  • Нажмите на кнопку Next (Далее) для перехода к окну Choose Tables Or Views (Выберите таблицы или образы). Мастер откроет подключение к данным, созданное в предыдущем шаге, и найдет базу данных. Вы можете выбрать таблицы источника данных, к которым должна подключиться веб-форма. Выберите все таблицы и образы, отображаемые в веб-форме; выбор осуществляется в левой области, после чего каждый элемент переносится в правую область окна посредством нажатия на кнопку ">". В нашем примере выбрана таблица tblEmployee (см. рис 2.11(рис 2.11) Окно Choose Tables Or Views (Выберите таблицы или образы) мастера форм данных
  • Нажмите на кнопку Next (Далее) для перехода к окну Choose Tables And Columns To Display On The Form (Выберите таблицы и столбцы, которые необходимо отобразить в форме). Мастер откроет таблицы или образы, выбранные в шаге 9, и покажет их с соответствующими столбцами, доступными для отображения в двойном списке выбора элементов.
  • Отметьте нужные столбцы для отображения в веб-форме.

    При выборе несколько таблиц появится окно Create A Relationship Between Tables (Создать отношение между таблицами), в котором выбираются ключи и отношения таблиц. В нашем примере для отображения выбраны все столбцы таблицы tblEmployee (см. рис. 2.12).

  • Нажмите на кнопку Finish (Готово). Visual Studio .NET сгенерирует законченную форму с именем employees.aspx со всем необходимым кодом в файле Codebehind и элементами управления, вставленными в форму для отображения данных таблицы (рис 2.12) Выбор таблиц и столбцов для отображения в форме
  • На рисунке 2.13 показана веб-форма employees.aspx, отображенная в представлении Design (Дизайн). Элементы управления можно перемещать для нужной настройки их отображения. Код, лежащий в основе формы, довольно высокого уровня, в нем присутствует даже обработка ошибок!

    (рис 2.13) Результирующая веб-форма, сгенерированная мастером форм данных, отображенная в представлении Design (Дизайн)

    Если employees.aspx установлена в качестве стартовой страницы, то нажмите на клавишу F5 для компиляции employees.aspx, чтобы открыть браузер и отобразить веб-форму. На пустой странице будет показана кнопка Load (Загрузить). Нажмите на кнопку Load (Загрузить), и данные отобразятся в браузере (см. рис. 2.14).

    (рис 2.14) Веб-форма employees.aspx, сгенерированная мастером форм данных и отображающая информацию из таблицы tblEmployee

    Использование XML

    В веб-формах можно использовать элемент управления XML, реализующий XML, XSL и XSL Transformations (XSLT). Для получения веб-формы, осуществляющей преобразование XML и XSL, создайте новую веб-форму и в представлении Design (Дизайн) вставьте в форму элемент управления XML (см. рис. 2.15). Элемент управления XML предназначен, главным образом, для интеграции веб-форм в приложении, использующем XSL для инкапсуляции логики представления.

    Элемент управления XML настраивается в окне свойств (см. рис. 2.15). В этом окне указывается файл XML или XSLT/XSL, и при открытии страницы осуществляется преобразование XML и XSL в HTML. Если в элементе управления указаны файлы, они должны являться частью проекта, отображаемого в Solution Explorer.

    (рис 2.15) Отображение в представлении Design (Дизайн) формы с элементом управления XML

    Размещение в форме элемента управления XML ограничено: дизайнер веб-форм позволяет располагать его только в левом верхнем углу представления Design (Дизайн) (см. рис. 2.15), хотя некоторые элементы управления размещаются и под элементами управления XML. Дизайнер веб-форм может не воспринять действительную структуру страницы в документе XSL или XSLT, поэтому его возможности по отображению страницы в представлении Design (Дизайн) сильно ограничены.

    Страницы:

    ASP.NET предлагает самый современный набор инструментов и технологических решений для разработки расширяемых веб-приложений. Редактором для программирования на базе ASP.NET является Visual Studio .NET. Приложения ASP.NET могут создаваться на различных языках программирования. Как правило, это языки Visual Basic и C#, и в данной лекции мы будем работать с языком C#.

    Visual Basic представляет собой популярный язык программирования для разработки программ на платформе Microsoft. Компания Microsoft расширяла возможности и опции языка Visual Basic до выпуска шестой версии без ущерба обратной совместимости. Версия 7 пакета Visual Basic поставляется с Visual Studio .NET; поддержка наследственности версий языка в ней упразднена. Фрагмент кода VB6 невозможно скомпилировать в Visual Basic .NET (версия 7). Visual Basic .NET имеет мощные функциональные возможности, например, реальное наследование, что делает его настоящим языком объектно-ориентированного (ОО) программирования.

    Следует отметить, что стили языков C++, Java и JavaScript оказывают сильное влияние на сообщество веб-программистов, поэтому в качестве языка программирования для интернета нужен язык с похожим стилем. Язык С#, новый язык от Microsoft в пакете Visual Studio .NET, обладает преимуществами языков типа C++ и Java, устраняя их недостатки. Итак, язык C# будет использоваться в данной лекции для демонстрации разработки веб-форм ASP.NET.

    Программистам VB потребуется изучить синтаксис нового языка и некоторые элементы его архитектуры для перехода к работе со средой разработки Visual Studio .NET Integrated Design Environment (IDE), и работа с языком C# расширит навыки программирования. Язык C# специфичен для технологии Microsoft, то же самое можно сказать и о Visual Basic. Тем не менее, C# соответствует конвенции, знакомой разработчикам, программирующим на Java.

    Обзор архитектуры интернет-форм

    Расширением файла страницы веб-формы ASP.NET является .aspx, и в этой лекции такой тип файлов называется ASPX. Каждая веб-форма ASP.NET имеет связанный с ней класс. Классы файла ASPX содержатся в файле кода формы, который называется Codebehind. Имя файла Codebehind указывается следующим образом: <имя_файла>.aspx.<расширение_языка>, где <имя_файла> – имя файла ASPX, <расширение_языка> – двухсимвольное расширение, отражающее язык файла Codebehind. Если файл ASPX называется Webform.aspx, то файл Codebehind имеет вид Webform.aspx.cs для языка C# и Webform.aspx для языка Visual Basic. Файл ASPX содержит визуальные элементы веб-формы, а файл Codebehind содержит логику, согласно которой эта форма функционирует. Все файлы Codebehind компилируются в динамически подключаемые библиотеки (DLL), отгружаемые на сервер вместе с соответствующими страницами ASPX. Библиотеке DLL проекта по умолчанию присваивается имя проекта.

    При запросе ASPX в IIS страница обрабатывается посредством расширения ISAPI ASP.NET aspnet_isapi.dll. Технология .NET генерирует еще одну временную библиотеку DLL на основе ASPX во время первого запроса файла. Эта DLL содержит класс, наследуемый от соответствующего класса веб-формы, сгенерированного в файле Codebehind, и располагается в библиотеке DLL проекта (см. рис. 2.1).

    Такая система существенно обобщает бизнес-логику и логику представления по сравнению с абстракцией, предлагаемой архитектурой ASP. Файл Codebehind содержит бизнес-логику, а ASPX – логику представления веб-формы.

    (рис 2.1) Обзор архитектуры веб-форм ASP.NET

    Возможности этих двух файлов усиливают уровень абстракции логики представления и бизнес-логики. Файлы ASPX – это файлы XML, содержащие элементы HTML и элементы управления серверной части для создания HTML. Программист может внедрять бизнес-логику в файлы ASPX, но на это ему придется затратить дополнительные усилия. Файлы Codebehind – это файлы с кодом, и разместить в них логику представления гораздо сложнее, чем использовать файлы ASPX. В ASP абстракция бизнес-логики и логики также представляет собой сложный процесс, поэтому в ASP логика представления и бизнес-логика объединяются при разработке программного решения.

    Начало работы с Visual Studio .NET

    Откройте Visual Studio .NET. Вы увидите начальную страницу, если ее отображение разрешено. Как и в предыдущей версии Visual Studio, по умолчанию предоставляется шаблон проекта (эту возможность можно отключить). Создадим новый проект веб-форм ASP.NET.

  • Нажмите на кнопку New Project (Создать проект) в окне шаблона проекта, чтобы открыть окно New Project (Создание проекта) с перечнем типов проектов и соответствующими шаблонами.
  • В списке слева выберите Visual C# Projects (Проекты Visual C#) – справа отобразятся шаблоны проектов, соответствующие C#.
  • Выберите шаблон проекта ASP.NET Web Application (Веб-приложение ASP.NET).
  • Введите свое имя проекта, отличное от имени в текстовом поле. Укажите имя сервера, задав URL (см. рис. 2.2) или путь UNC к корневому веб-каталогу. В URL укажите имя сервера по умолчанию localhost, если разрабатываемое программное решение располагается на рабочей станции во время написания кода и модульного тестирования. В нашем примере указано имя SimpleWF.
  • Нажмите на кнопку OK. Vusual Studio .NET подключится к несущему серверу и сгенерирует файлы проекта. Visual Studio.NET вносит изменения на веб-сервере через порт 80, создавая новый виртуальный каталог, связанный с файловым каталогом, в котором находятся файлы проекта веб-формы. Если на порте 80 отсутствует веб-сервер IIS, или если IIS не работает, то Visual Studio .NET не сможет сгенерировать проект веб-приложения.
  • (рис 2.2) Присвоение имени проекту веб-приложения ASP.NET SimpleWF

    При успешном подключении Visual Studio .NET к серверу, указанному в окне New Project (Создание проекта), по умолчанию генерируются следующие файлы:

  • AssemblyInfo.cs ;
  • Global.asax ;
  • Global.asax.resx ;
  • SimpleWF.csproj ;
  • SimpleWF.csproj.webinfo ;
  • SimpleWF.vsdisco ;
  • Web.Config ;
  • WebForm1.aspx ;
  • WebForm1.aspx.cs ;
  • WebForm1.aspx.resx.
  • После создания веб-формы на узле редактор отобразит пустую веб-форму с именем WebForm1, готовую для редактирования (см. рис. 2.3).

    Для редактирования веб-форм в Visual Studio .NET используется дизайнер веб-форм (Web Forms Designer). Он позволяет переходить из представления формы в представление HTML для отображения кода XML и HTML с помощью кнопки HTML в левом нижнем углу окна веб-формы.

    (рис 2.3) Веб-форма в представлении Design (Дизайн) дизайнера веб-форм

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

    Файл веб-формы – ASPX

    Файл ASPX является отображаемым файлом веб-приложения ASP.NET. Конечный пользователь запрашивает его в своем веб-браузере для реализации функциональных возможностей веб-приложения ASP.NET. Если конечному пользователю нужно просмотреть веб-форму этого файла из IIS, необходимо выполнить запрос из веб-браузера по адресу http://<URL_моего_узла>/<мой_виртуальный_веб-каталог>/WebForm1.aspx, введя его в адресной строке.

    Создаваемому виртуальному каталогу по умолчанию присваивается имя проекта. Все веб-приложения ASP.NET генерируют виртуальный веб-каталог при установке в IIS. Файлы WebForm1.aspx.cs и WebForm1.aspx.resx используются для создания проектной библиотеки DLL – результата компиляции файла WebForm1.aspx. Файл aspx.cs называется кодом реализации файла ASPX, а файл ASPX – главным файлом. Файл aspx.cs содержит весь код, реализующий ASPX, а aspx.resx представляет собой файл-источник веб-формы.

    В листинге 2.1 показано представление HTML файла ASPX веб-формы ASP.NET. В нем можно изменять код HTML и сценарий javascript клиентской части, однако с помощью элементов управления веб-формы ASP.NET в представлении Design (Дизайн) вы создадите сложную веб-страницу без написания кода HTML. Представление Design (Дизайн) дизайнера веб-форм является редактором типа WYSIWIG ("что вижу на экране, то и получаю при печати"), абстрагирующим разработчика от кода HTML и дающим возможность наглядного построения веб-сраниц (по аналогии со средой IDE для приложений рабочего стола в Visual Basic 6). Если вам больше нравится программировать вручную, используйте область HTML-инструментария для получения элементов HTML.

    <%@ Page language="c#" Codebehind="requestSomething.aspx.cs" AutoEventWireup="false" Inherits="SimpleWF.requestSomething" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
      <HEAD>
       <title>requestSomething</title>
      <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
      <meta name="CODE_LANGUAGE" Content="C#">
      <meta name="vs_defaultClientScript" content="JavaScript">
      <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
      </HEAD>
      <body MS_POSITIONING="GridLayout">
       <form id="requestSomething" method="post" runat="server">
        <asp:TextBox id="txtYourself" style=
         "Z-INDEX: 101; LEFT: 193px; POSITION: absolute; 
         TOP: 46px" runat="server" Width="330px" 
         Height="25px">
        </asp:TextBox>
        <asp:Label id="Label1" style=
         "Z-INDEX: 102; LEFT: 26px; POSITION: absolute; 
          TOP: 41px" runat="server" Width="155px" 
          Height="43px">
          Tell me about yourself and click submit:
        </asp:Label>
        <asp:TextBox id="txtResponse" style=
         "Z-INDEX: 103; LEFT: 57px; POSITION: absolute; 
          TOP: 148px" runat="server" Width="435px" 
          Height="101px" ReadOnly="True" 
          TextMode="MultiLine">
        </asp:TextBox>
        <asp:Button id="Button1" style=
         "Z-INDEX: 104; LEFT: 298px; POSITION: absolute; 
          TOP: 79px" runat="server" Width="131px" 
          Height="43px" Text="Submit">
        </asp:Button>
        <asp:Label id="Label2" style=
         "Z-INDEX: 105; LEFT: 66px; POSITION: absolute; 
         TOP: 116px" runat="server" Width="138px" 
         Height="27px">You Said:
        </asp:Label>
       </form>
      </body>
    </HTML>

    Первая строка requestSomething.aspx определяет файл Codebehind с именем requestSomething.aspx.cs. Global.asax использует такие же правила именования файлов, что и файл requestSomething.aspx, обращаясь к файлу Global.asax.cs. Назначение файла Global.asax такое же, как в ASP – обеспечить место расположения для записи кода, доступное веб-формам рассматриваемого проекта, которое позволит разработчику фиксировать события, связанные с приложением. Например, в ASP файл Global.asa обеспечивает запуск и остановку приложения, открытие и закрытие сеанса; файл Global.asax предоставляет класс Global, наследующий System.Web.HttpApplication и содержащий функции, связанные с этими событиями. Кроме того, Global.asax предоставляет события начала и завершения запроса на ресурсы, процесса аутентификации и ошибок приложения.

    Веб-форма requestSomething.aspx содержит три элемента управления. Они добавлены из области Web Forms (Веб-формы). В дизайнере веб-форм можно добавлять элементы управления в веб-форму, как при создании приложения рабочего стола в Visual Basic или в Visual C++. Интерфейс элементов управления практически такой же.

    Разработчики создают код веб-форм так же, как они программируют классы форм в Visual Basic или Visual C++. Представление свойств элемента управления имеет формат XML и располагается в файле ASPX. Технология .NET использует XML для инициализации нужного элемента управления и создания кода HTML, возвращаемого потребителю. Инструментарий Visual Studio .NET позволяет разработчикам выбирать элементы HTML. Например, элементы DataGrid и таблица HTML реализуют отображение таблицы в веб-браузере. Элемент управления веб-формы DataGrid дает более обширное программное управление заполнением и конфигурацией таблицы по сравнению с элементом таблицы HTML. В листингах 2.2 и 2.3 показаны различия между элементом управления веб-формы DataGrid и элементами HTML. В листинге 2.2 приведен код XML, размещенный в файле ASPX и представляющий собой элемент управления DataGrid.

    <asp:DataGrid id="DataGrid2" 
    style="Z-INDEX: 104; LEFT: 88px; POSITION: absolute; TOP: 258px"
    runat="server">
    </asp:DataGrid>

    В листинге 2.3 показан элемент HTML, созданный при вставке таблицы из области HTML-инструментария в веб-форму.

    <TABLE id="Table1" style="Z-INDEX: 103; LEFT: 191px; 
    POSITION: absolute; TOP: 291px" cellSpacing="1" 
    cellPadding="1" width="300" border="1">
      <TR>
       <TD></TD>
       <TD></TD>
       <TD></TD>
      </TR>
      <TR>
       <TD></TD>
       <TD></TD>
       <TD></TD>
      </TR>
      <TR>
       <TD></TD>
       <TD></TD>
       <TD></TD>
      </TR>
    </TABLE>

    В простейшей веб-форме requestSomething.aspx (см. рис. 2.4) пользователь может ввести некоторую личную информацию и нажать на кнопку Submit (Отправить). После отправки веб-формы он получает ответ в виде содержимого, введенного им в текстовом поле с именем Tell Me About Yourself And Click Submit (Расскажите о себе и нажмите на кнопку Submit [Отправить]), а также в поле You Said (Вы сказали). На рисунке 2.4 показана форма requestSomething.aspx после отправки информации на сервер.

    (рис 2.4) Веб-форма requestSomething.aspx в действии

    Файл Codebehind веб-формы – aspx.cs

    В классическом ASP разработчик размещает в файле ASP код для извлечения данных, отправленных пользователем. После извлечения данных из объекта Request они располагаются в атрибуте значения другого текстового поля, отображающего отправленную пользователем информацию. В файле ASP нужный результат достигается в строке кода:

    <textarea name="txtResponse" ><% =Request("txtYourself") %>
    </textarea>

    В веб-форме ASP.NET требуется разработка большего объема кода, но с более высоким уровнем организации. В листинге 2.4 приведен код веб-формы requestSomething.aspx в файле requestSomething.aspx.cs. Дизайнер веб-форм автоматически генерирует большую часть кода, приведенного в листинге 2.4. При открытии файла requestSomehing.aspx в представлении Design (Дизайн) и двойном щелчке на элементе управления верхнего текстового поля txtYourself дизайнер веб-форм создаст событие в файле requestSomething.aspx.cs с именем txtYourself_TextChanged. Дизайнер веб-форм откроет файл requestSomething.aspx.cs для получения функции события, созданной для элемента управления txtYourself. Несмотря на то, что дизайнер веб-форм генерирует большую часть кода в файле Codebehind, этот код при желании можно редактировать вручную.

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    namespace SimpleWF
    {
      /// <summary>
      /// Summary description for requestSomething.
      /// </summary>
      public class requestSomething : System.Web.UI.Page
      {
       protected System.Web.UI.WebControls.Button Button1;
       protected System.Web.UI.WebControls.TextBox txtYourself;
       protected System.Web.UI.WebControls.TextBox txtResponse;
       protected System.Web.UI.WebControls.Label Label2;
       protected System.Web.UI.WebControls.Label Label1;
      
       private void Page_Load(object sender, System.EventArgs e)
       {
        // Put user code to initialize the page here
       }
       #region Web Form Designer generated code
       override protected void OnInit(EventArgs e)
       {
        //
        // CODEGEN: This call is required by the 
        // ASP.NET Web Form Designer.
        //
        InitializeComponent();
        base.OnInit(e);
       }
       
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       { 
        this.txtYourself.TextChanged += new
        System.EventHandler(this.txtYourself_TextChanged);
    
        this.Load += new 
        System.EventHandler(this.Page_Load);
       }
       #endregion
       private void txtYourself_TextChanged 
          (object sender, System.EventArgs e)
       {
        this.txtResponse.Text = this.txtYourself.Text;
       }
      }
    }

    Обработчик события веб-формы вызывается при изменении и отправке на веб-сервер значения txtYourself в форме. После отправки формы серверу файл Codebehind веб-формы requestSomething.aspx определяет, что отправлено значение текстового поля txtYourself и вызывает функцию события txtYourself_TextChanged. В нашем примере для размещения значения, отправленного в текстовое поле txtResponse, создана единственная строка кода:

    this.txtResponse.Text = this.txtYourself.Text;

    Оба текстовых поля воспринимаются как элементы управления или экземпляры классов в обычном программном приложении, полностью абстрагируя программиста от деталей HTML. Так как программист может вставлять элементы управления в представлении Design (Дизайн) и изменять код, связанный с действием элемента управления, щелкнув на этом элементе, он практически полностью избавляется от редактирования кода HTML.

    Файл AssemblyInfo.cs

    Проект ASP.NET с именем SimpleWF создает библиотеку – установочный пакет для файлов веб-формы, из которых состоит проект; эта библиотека является обычной DLL. Библиотека создается при первом запросе файла ASPX из IIS. Файл Codebehind и файл источника, ссылки на которые содержатся в файле ASPX, компилируются в языке инструкций Microsoft (MISL). Формат этого языка аналогичен коду библиотеки в отличие от двоичных продуктов других компиляторов. MISL создается только для исполняемых подпрограмм кода.

    Файлы AssemblyInfo.cs, SimpleWF.csproj, SimpleWF.csproj.webinfo и SimpleWF.vsdisco поставляют компилятору необходимую информацию для создания библиотеки, содержащей код MISL, сгенерированный из файлов ASP.NET. Информация в файле AssemblyInfo.cs представляет собой описание библиотеки, например, ее версию и имя. Этот файл можно использовать для подписи библиотек посредством присвоения ключа, который является механизмом защиты библиотеки от реинжиниринга. В листинге 2.5 приведен код пустого файла AssemblyInfo.cs. Файл библиотеки можно редактировать напрямую, и для этого не требуется высокого уровня знаний. Укажите известные значения, оставив другие значения незаполненными.

    using System.Reflection;
    using System.Runtime.CompilerServices;
    [assembly: AssemblyTitle("")]
    [assembly: AssemblyDescription("")]
    [assembly: AssemblyConfiguration("")]
    [assembly: AssemblyCompany("")]
    [assembly: AssemblyProduct("")]
    [assembly: AssemblyCopyright("")]
    [assembly: AssemblyTrademark("")]
    [assembly: AssemblyCulture("")]
    [assembly: AssemblyVersion("1.0.*")]
    [assembly: AssemblyDelaySign(false)]
    [assembly: AssemblyKeyFile("")]
    [assembly: AssemblyKeyName("")]

    Файл проекта – csproj

    Файл csproj является файлом XML и содержит информацию о зависимостях проекта и некоторых параметрах компиляции библиотеки. Visual Studio .NET обновляет этот файл по мере добавления или удаления из проекта веб-форм и ссылок. Не следует изменять файл csproj при обычной работе с проектом ASP.NET. При открытии файла в браузере отображается информация обо всех параметрах и элементах, составляющих проект: имена файлов, параметры реализации и ссылки библиотеки и т.д.

    Файл проекта WebInfo – csproj.webinfo

    Файл csproj.webinfo представляет собой файл XML и описывает расположение файла проекта. В листинге 2.6 приведено содержание файла SimpleWF.csproj.webinfo. Он также генерируется и обновляется Visual Studio. .NET, и его не следует редактировать напрямую.

    <VisualStudioUNCWeb>
     <Web URLPath = "http://amd1700/SimpleWF/SimpleWF.csproj" />
    </VisualStudioUNCWeb>

    Файл информации о поиске – vsdisco

    Файл vsdisco определяет пути поиска на сервере разработки, что дает ASP.NET возможность нахождения веб-служб ASP.NET. Файл SimpleWF.vsdisco генерируется для проекта SimpleWF по умолчанию. В листинге 2.7 приведен исходный код файла SimpleWF.vsdisco. Для упрощения поиска ASP.NET других библиотек в среде разработки следует отредактировать файл vsdisco, указав в нем веб-каталоги, в которых не нужно осуществлять поиск. В версии vsdisco по умолчанию исключаются папки расширения FrontPage, так как обычно библиотеки в этих папках не содержатся.

    <?xml version="1.0" encoding="utf-8" ?>
    <dynamicDiscovery xmlns=
         "urn:schemas-dynamicdiscovery:disco.2000-03-17">
      <exclude path="_vti_cnf" />
      <exclude path="_vti_pvt" />
      <exclude path="_vti_log" />
      <exclude path="_vti_script" />
      <exclude path="_vti_txt" />
      <exclude path="Web References" />
    </dynamicDiscovery>

    Файл веб-конфигурации – web.config

    Файл web.config представляет собой файл конфигурации IIS. Программист использует его для настройки IIS на определенную работу в процессе разработки. Когда проект ASP.NET готов к реализации, сайт или виртуальный каталог IIS немедленно настраивается согласно этой конфигурации. Параметры файла web.config применяются ко всем папкам каталога, в котором расположен данный файл, если ни в одной из них не содержится другого файла web.config (в веб-приложении их может содержаться несколько). Если файл web.config отсутствует, то по умолчанию используется файл machine.config, расположенный в папке $:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG. Фрагмент пути v1.1.4322 отражает версию технологии .NET, используемой на сервере. В листинге 2.8 приведен файл по умолчанию web.config, созданный в проекте SimpleWF.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration> 
     <system.web> 
     <compilation
      defaultLanguage="c#"
      debug="true"
     /> 
     <customErrors
     mode="RemoteOnly"
     />
     <authentication mode="Windows" />
     <trace
      enabled="false"
      requestLimit="10"
      pageOutput="false"
      traceMode="SortByTime"
       localOnly="true"
     /> 
     <sessionState
       mode="InProc"
       stateConnectionString="tcpip=127.0.0.1:42424"
       sqlConnectionString=
          "data source=127.0.0.1;user id=sa;password="
       cookieless="false"
       timeout="20"
     /> 
     <globalization
       requestEncoding="utf-8"
       responseEncoding="utf-8"
     /> 
    </system.web>
    </configuration>

    Параметры приложения устанавливаются как дочерние элементы элемента appSettings, который, в свою очередь, является дочерним по отношению к элементу configuration. Файл web.config по умолчанию не содержит параметров приложения. Эти параметры обычно включаются динамическими свойствами элементов управления, добавленных в веб-формы в дизайнере веб-форм или введенных вручную. Параметры приложения содержат значения инициализации компонентов приложения. Об использовании файла web.config для хранения и извлечения параметров приложения более подробно рассказывается в лекции 3.

    Элемент system.web имеет дочерние элементы, содержащие параметры управления механизмом самого веб-приложения. При отсутствии дочерних элементов приложение использует параметры файла machine.config. Приведенный ниже список возможных параметров далеко не полон, однако формирующие этот список дочерние элементы элемента system.web по умолчанию присутствуют в файле web.config, созданном Visual Studio .NET:

  • compilation. Определяет параметры компиляции приложения по умолчанию;
  • customErrors. Определяет конфигурацию отчетов об ошибках;
  • authentication. Определяет используемый метод аутентификации;
  • trace. Определяет метод, согласно которому функционирует служба .NET Trace;
  • sessionState. Определяет функционирование сеанса и механизм для управления этим сеансом;
  • globalization. Определяет параметры набора символов, кодировки и настройки, связанные с культурой языка.
  • Построение веб-форм

    Отображение информации из базы данных в таблице HTML реализуется с помощью элемента управления веб-формы DataGrid. В представлении Design (Дизайн) выберите DataGrid в инструментарии и вставьте этот элемент в веб-форму. При отображении кода HTML вы имеете дело с представлением формы в HTML. На рисунке 2.3 изображена веб-форма в представлении Design (Дизайн).) После добавления в форму элемента DataGrid его можно переименовать в окне свойств. На рисунке 2.5 мы видим, что элементу DataGrid присвоено имя dgChair.

    (рис 2.5) Окно свойств элемента управления DataGrid

    Запуск веб-формы в Visual Studio .NET на данном этапе вызовет компиляцию веб-формы в библиотеку на сервере разработки. В нашем примере сервер разработки, на котором расположена веб-форма, называется amd1700. Для компиляции веб-формы и запуска ее в режиме отладки в Visual Studio .NET нажмите на клавишу F5. Visual Studio .NET скомпилирует веб-форму и перейдет в режим отладки аналогично тому, как это происходило в предыдущих версиях Visual Studio при запуске исполняемого файла Visual Basic или Visual C++.

    После завершения компиляции на рабочей станции откроется браузер с отображением веб-формы. Сервер разработки выполнит действия, необходимые для отображения веб-страницы, и браузер откроет пустую страницу. При закрытии браузера сеанс отладки завершится, и Visual Studio .NET вернется в режим редактирования. В данном упражнении отображается пустая страница, поскольку элемент DataGrid dgChair не содержит никаких данных. Для отображения элементом DataGrid данных нужно создать в файле Codebehind код, реализующий получение элемента DataSet и размещение данных в элементе управления dgChair.

    Изменение кода веб-формы, ориентированной на работу с данными

    Чтобы изменить файл Codebehind веб-формы с элементом dgChair, щелкните правой кнопкой мыши на файле веб-формы в Solution Explorer или правой кнопкой мыши на самом файле в представлении Design (Дизайн). Затем выберите View Code (Просмотреть код). По умолчанию Visual Studio .NET отображает в Solution Explorer не все файлы программного решения. Щелкните на значке Show All Files (Показать все файлы) в верхней части Solution Explorer для показа всех файлов, чтобы выбрать файл Codebehind.

    Файл Codebehind отобразится с директивами using для классов, необходимых для функционирования веб-формы, с пространством имен и структурой классов. Пространство имен носит то же имя, что и рассматриваемый проект. Имя класса совпадает с именем веб-формы. В листинге 2.9 приведен исходный код веб-формы showGrid. Веб-форма showGrid демонстрирует элемент управления DataGrid. Дизайнер веб-форм разместил защищенный элемент в классе showGrid, представляющий элемент dgChair, добавленный в веб-форму. Ссылка using System.Data.OleDb добавлена для простоты обращения к классам ADO.NET.

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Data.OleDb; //for the OleDbclasses
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    namespace SimpleWF
    {
      /// <summary>
      /// Summary description for showGrid.
      /// </summary>
      public class showGrid : System.Web.UI.Page
      {
       protected System.Web.UI.WebControls.DataGrid dgChair;
       private void Page_Load(object sender, System.EventArgs e)
       {
       }
       #region Web Form Designer generated code
       override protected void OnInit(EventArgs e)
       {
        //
        // CODEGEN: This call is required by the 
        // ASP.NET Web Form Designer.
        //
        InitializeComponent();
        base.OnInit(e);
       }
       
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       { 
        this.Load += new System.EventHandler
                (this.Page_Load);
       }
       #endregion
      }
    }

    Если вам нужно заполнить элемент dgChair данными из таблицы базы данных, то требуется получение набора данных ADO.NET DataSet с информацией из базы данных. Набор DataSet используется для заполнения элемента dgChair при запросе веб-страницы с веб-сервера. При загрузке страницы с веб-сервера вызывается событие Load объекта Page. Класс showGrid наследуется из System.Web.UI.Page, как видно из объявления класса в листинге 2.9, поэтому событие Load также наследуется из System.Web.UI.Page. При выполнении события Load происходит получение набора DataSet и заполнения элемента DataGrid. В листинге 2.10 приведена подпрограмма LoadGrid, реализующая заполнение элемента DataGrid набором DataSet.

    private void LoadGrid(DataGrid dg)
    {
      //set the connection credentials
      string DataSetName = "myChairs";
      string ConnectionString =
         "Provider=Microsoft.Jet.OLEDB.4.0;" + 
             "Data Source=C:\\aspData\\employees.mdb;"; 
    
      //make the DB connection
      OleDbConnection myConn = new
       OleDbConnection(ConnectionString);
    
      //make a data set to hold chairs
      DataSet myDataSet = new DataSet(DataSetName);
    
      //make a data adaptor
      OleDbDataAdapter myAdapt = new
       OleDbDataAdapter("Select * From tblChair", myConn);
    
      //fill the dataset
      myAdapt.Fill(myDataSet);
    
      //get a view in the dataset
      DataView myDataView = new DataView(myDataSet.Tables[0]);
    
      //show the data view in the Grid
      dg.DataSource = myDataView;
      dg.DataBind();
    }

    LoadGrid представляет собой функцию, входящую в класс showGrid. Функция вызывается посредством размещения следующего вызова в функции события Page_Load файла showGrid.aspx:

    LoadGrid(dgChair);

    Безопасность ASP.NET

    При загрузке страницы showGrid.aspx фиксируется событие Load и вызывается функция LoadGrid. При вызове функции LoadGrid устанавливается подключение к базе данных посредством строковой переменной и инициализируется объект подключения ADO Connection.

    Примечание. Следует отметить, что указывать символьные аргументы строки подключения в коде, как в листинге 2.10, крайне не рекомендуется. Это сделано, чтобы показать аутентификационные данные, используемые для подключения, а также метод их применения к объекту Connection. Рекомендуем получать аутентификационные данные, размещая строки подключения к базе данных в файле web.config (см. лекции 3).

    В листинге 2.10 используется источник данных Microsoft Access 2000. Чтобы веб-форма ASP.NET могла считывать и записывать информацию в файл базы данных Access, необходимо настроить файловые разрешения сервера для файлов данных Access ( .mdb ). При использовании базы данных корпоративного уровня, например, SQL Server или Oracle, для передачи аутентификационных данных серверу базы данных при ее запросе веб-формой ASP.NET возможно применение интегрированной безопасности. Аргумент integrated security=sspi в строке подключения к базе данных указывает использование интегрированной безопасности, и аутентификационные данные Windows .NET Server предоставляются источнику данных. Учетная запись пользователя Windows, используемая приложением ASP.NET, меняться в зависимости от следующих критериев.

  • Аутентификация осуществляется для приложения ASP.NET. Анонимная или не анонимная.
  • Используется режим изоляции IIS. Режим изоляции IIS 5.0 или режим изоляции рабочих процессов.
  • В зависимости от метода аутентификации в приложении IIS ASP.NET использует следующие учетные записи Windows.

  • Гостевая учетная запись Windows IIS для анонимного доступа. IUSER_<имя_компьютера>
  • Субъект пула приложения. Учетная запись Windows, определенная в пуле приложения. Учетными записями по умолчанию являются Network Service (Сетевая служба), Local Service (Локальная служба) и Local System (Локальная система).
  • Учетная запись Windows-аутентифицируемого пользователя, являющегося потребителем приложения. Аутентификационные данные, предоставленные пользователем при аутентификации приложения сервера ASP.NET.
  • Если IIS настроен на разрешение анонимного доступа к сайту, и для сервера установлен режим изоляции приложения по умолчанию (т.е. режим изоляции рабочих процессов), то ASP.NET использует субъект в пуле приложения, занятом веб-приложением. Если режим изоляции IIS 5.0 используется для обеспечения обратной совместимости, то субъектом пула приложения будет гостевая учетная запись IIS. Если приложение настроено на использование одного из режимов аутентификации, доступных в IIS и предусматривающих предоставление аутентификационных данных пользователем, то IIS по умолчанию использует в качестве субъекта аутентификационные данные. Субъекты, используемые по умолчанию приложением IIS, приведены в табл. 2.1.

    В рассматриваемом приложении (или в любом другом) возможны и другие субъекты доступа. Например, для авторизации доступа пользователя к приложению применяется аутентификация форм, и, в то же время, используется специальная учетная запись пользователя для выполнения всех запросов базы данных.

    Для веб-формы showGrid.aspx применяется режим изоляции рабочих процессов. Анонимный доступ будет разрешен, поэтому аутентификационными данными учетной записи Windows пула приложений станут входные данные, используемые для доступа к источнику информации. Для файла базы данных Microsoft Access файловые разрешения несущего сервера устанавливаются так, чтобы учетная запись Windows производила чтение, запись и изменение файла .mdb. Если речь идет о базе данный корпоративного уровня, то учетной записи Windows нужно предоставить соответствующий доступ к базе данных на сервере базы данных.

    Примечание. Следует помнить, что файл web.config содержит элемент authentication. Режимом элемента аутентификации по умолчанию является Windows. Так как многие программисты используют учетную запись группы администраторов, то впечатление о правильности параметров в форме ASP.NET может быть обманчивым, так как эта учетная запись наделена правами на выполнение практически любых действий в среде разработки. При перемещении приложения на тестовый или конечный сервер с ограниченными разрешениями доступа возможно, что веб-форма не будет функционировать.

    Субъекты по умолчанию для приложения ASP.NET
    АутентификацияРежим изоляции приложенияУчетная запись Windows, используемая ASP.NET
    Анонимная Изоляция IIS 5.0 IUSER_<имя_компьютера>.
    Анонимная Изоляция рабочих процессов Субъект пула приложения для веб-приложения.
    Не анонимная Изоляция IIS 5.0 Аутентификационные данные, предоставленные пользователем при проверке подлинности.
    Не анонимная Изоляция рабочих процессов Аутентификационные данные, предоставленные пользователем при проверке подлинности.

    Обзор технологии ADO.NET

    Для заполнения элемента dgChair данными из таблицы базы данных мы будем использовать ADO.NET, поэтому нужно добавить в файл showGrid.aspx пространство имен для классов данных, необходимых для доступа к источнику данных. Веб-формы по умолчанию содержат пространство имен System.Data, являющееся главным пространством имен ADO.NET. Другие пространства имен, подчиненные System.Data, поддерживают определенные типы источников данных. Стандартными пространствами имен, подчиненными System.Data, являются следующие.

    System.Data.Common.
    System.Data.OleDb.
    System.Data.SqlClient.
    System.Data.SqlTypes.

    Пространство имен SqlClient обеспечивает интерфейс к провайдеру SQL Server и наиболее эффективный способ связи с SQL Server 2000. Пространство имен System.Data.OleDb поддерживает интерфейс, аналогичный традиционной технологии ADO; оно неэффективно при подключении к SQL Server 2000. System.Data.Ole.Db рекомендуется для работы с источниками данных, отличными от SQL Server 2000, имеющими провайдера OLE-DB. Пространства имен System.Data.Common и System.Data.SqlTypes обеспечивают интерфейсы для SQL Server и общие интерфейсы между SQL Server и классами OLE-DB.

    ADO.NET поставляется в виде единственной библиотеки – System.Data.dll. Если необходима поддержка источника данных ODBC, Microsoft предлагает другую библиотеку (ее можно загрузить из интернета) для обеспечения пространства имен классов ODBC.

    Поскольку источником данных, рассматриваемым в примерах данной лекции, является Microsoft Acess 2000, то следует использовать пространство имен OleDb. Если источником данных является SQL Server 2000, то используется пространство имен SqlClient – это наиболее эффективный способ установки связи с SQL Server 2000. Вверху файла showGid.aspx необходимо вместе с остальными директивами пространства имен ввести следующую строку кода:

    using System.Data.OleDb; //for the OleDb classes

    Использование классов ADO.NET для заполнения элемента управления DataGrid

    После установки соединения выполняется запрос экземпляра набора данных ADO.NET myDataSet таблицы tblChairs базы данных. Набору данных DataSet при инициализации присваивается имя myChairs. Инициализируется объект ADO.NET Adaptor для заполнения экземпляра myDataSet. После этого инициализируется объект ADO.NET DataView с именем myDataView с использованием первой таблицы набора данных myDataSet. В итоге аргумент DataGrid с именем dg, переданный подпрограмме, устанавливает свойство источника данных на экземпляр DataView с именем myDataView, и вызывает метод DataBind аргумента dg для заполнения экземпляра dg элемента DataGrid данными из таблицы tblChairs.

    Использование класса DataView не является обязательным, если нужно отобразить весь набор данных DataSet. В элементе dg (см. листинге 2.10) отображается весь созданный набор данных DataSet, поэтому можно опустить следующую строку:

    DataView myDataView = new DataView(myDataSet.Tables[0]);

    Свойство DataSource элемента dg установим равным значению Tables[0] свойства набора данных myDataSet. Строку, присваивающую dg.DataSource источнику myDataView, изменим следующим образом:

    dg.DataSource = myDataSet.Tables[0]

    При нажатии на клавишу F5 будет скомпилирована страница showGrid.aspx, затем откроется окно браузера с отображением данных в таблице myChairs (см. рис. 2.6).

    (рис 2.6) Отображение результатов работы showGrid.aspx с использованием DataGrid

    Применение элемента управления DataList

    Помимо DataGrid для отображения информации из базы данных используются и другие типы элементов управления данными. Элемент управления DataList применяется для отображения данных в формате, отличном от табличной формы. В листинге 2.11 приведен исходный код файла datalist.aspx.cs, представляющий собой веб-форму, в которой элемент управления DataList заполняется данными с помощью набора ADO.NET Dataset.

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Data.OleDb; //for the OleDb classes
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    namespace SimpleWF
    {
      /// <summary>
      /// Summary description for datalist.
      /// </summary>
      public class datalist : System.Web.UI.Page
      {
       protected System.Web.UI.WebControls.DataList dlChair;
      
       private void LoadList(DataList dl)
       {
        //set the connection credentials
        string DataSetName = "myChairs";
        string ConnectionString =
         "Provider=Microsoft.Jet.OLEDB.4.0;" + 
       "Data Source=C:\\aspData\\employees.mdb;";
    
        //make the DB connection
        OleDbConnection myConn = new
         OleDbConnection(ConnectionString);
    
        //make a data set to hold chairs
        DataSet myDataSet = new DataSet(DataSetName);
    
        //make a data adaptor
        OleDbDataAdapter myAdapt = new
         OleDbDataAdapter("Select * From tblChair", myConn);
         
    
        //fill the dataset
        myAdapt.Fill(myDataSet);
    
        //show the data in the data list
        dl.DataSource = myDataSet;
        dl.DataBind();
       }
       private void Page_Load(object sender, System.EventArgs e)
       {
        LoadList(this.dlChair);
       }
       #region Web Form Designer generated code
       override protected void OnInit(EventArgs e)
       {
        //
        // CODEGEN: This call is required by the 
        // ASP.NET Web Form Designer.
        //
        InitializeComponent();
        base.OnInit(e);
       }
       
       /// <summary>
       /// Required method for Designer support - do not modify
       /// the contents of this method with the code editor.
       /// </summary>
       private void InitializeComponent()
       { 
        this.Load += new System.EventHandler(this.Page_Load);
       }
       #endregion
      }
    }

    DataList использует иной механизм построения DataSet, называемый шаблоном. Шаблон описывает способ отображения данных в элементе управления DalaList. Щелкните правой кнопкой мыши на DataList и выберите любую из опций редактирования шаблона в команде Edit Template (Изменить шаблон) контекстного меню. В шаблоне настраиваются заголовки или имена полей, определяющие отображение данных. В DataList присутствуют также верхние, нижние колонтитулы и названия. Для указания данных из определенного набора DataSet необходимо изменить шаблон в представлении HTML. Теги <%# и %> означают присоединение данных в странице веб-формы. В коде шаблона указываются поля присоединения данных. В листинге 2.12 приведен код файла datalist.aspx, отображаемый в представлении HTML.

    <%@ Page language="c#" Codebehind="datalist.aspx.cs" 
     AutoEventWireup="false" Inherits="SimpleWF.datalist" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
      <HEAD>
       <title>datalist</title>
      <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
      <meta name="CODE_LANGUAGE" Content="C#">
      <meta name="vs_defaultClientScript" content="JavaScript">
      <meta name="vs_targetSchema"
       content="http://schemas.microsoft.com/intellisense/ie5">
      </HEAD>
      <body MS_POSITIONING="GridLayout" bgColor="#ffffff">
       <form id="datalist" method="post" runat="server">
        <asp:DataList id="dlChair" style=
         "Z-INDEX: 102; LEFT: 18px; POSITION: absolute;
          TOP: 34px" runat="server" Height="301px" 
          Width="316px">
         <ItemTemplate>
         <DIV style="PADDING-RIGHT: 15px; 
            PADDING-LEFT: 15px; PADDING-BOTTOM: 
            15px; FONT: 12pt verdana; 
            COLOR: black; PADDING-TOP: 15px" 
            align="left">ID:</DIV>
         <%# DataBinder.Eval(Container.DataItem, "ID")%>
         <DIV style="PADDING-RIGHT: 15px; PADDING-LEFT: 
           15px; PADDING-BOTTOM: 15px; 
           FONT: 12pt verdana; 
           COLOR: black; PADDING-TOP: 15px" 
           align="left">Color:</DIV>
         <%# DataBinder.Eval(Container.DataItem, "Color")%>
         </ItemTemplate>
        </asp:DataList>
       </form>
      </body>
    </HTML>

    DataList определяется элементами HTML <asp:DataList>. Внутри тегов элемента DataList располагаются теги шаблона, определяемые тегом <ItemTemplate>. Свойства шаблона в дизайнере веб-форм генерируют теги внутри тегов <ItemTemplate>, однако их можно отредактировать вручную в представлении HTML. Теги присоединения данных можно стратегически расположить внутри шаблона в тех местах, где должны отображаться соответствующие поля набора данных DataSet. В листинге 2.12 приведены два поля из отображаемого набора DataSetID и Color. Тег присоединения для поля ID имеет вид <%#DataBinder.Eval(Container.DataItem, "ID")%>, а тег присоединения поля Color<%#DataBinder.Eval(Container.DataItem, "Color")%>.

    При запуске datalist.aspx сгенерирован тот же набор DataSet, как в примере с элементом DataGrid (см. рис. 2.6). Однако формат данных отличается от предыдущего примера (см. рис. 2.7), поскольку данные отформатированы по шаблону, приведенному в листинге 2.12.

    (рис 2.7) Результат работы файла datalist.aspx, полученный при помощи шаблона для форматирования набора DataSet

    Мастер форм данных

    Дизайнер веб-форм содержит мастер для создания форм, отображающий наборы данных из источника. Для работы с мастером форм данных (Data From Wizard) выполните следующие действия.

  • В Solution Explorer щелкните правой кнопкой мыши и выберите Add New Item (Добавить новый элемент).
  • В диалоговом окне Add New Item (Добавление нового элемента) вы увидите большое количество типов файлов, которые можно добавить в проект – они отображаются в правой панели. Разверните дерево каталогов слева, и вы увидите дочерние элементы дерева, представляющие собой категории, при выборе которых изменяется набор отображаемых в правой панели элементов.
  • Выберите Data Form Wizard (Мастер форм данных) и введите имя файла (см. рис 2.8(рис 2.8) Выбор мастера форм данных (Data Form Wizard)
  • Нажмите на кнопку Open (Открыть), и в Visual Studio .NET будет создана новая веб-форма. В нашем примере она называется employees.aspx.
  • Откроется мастер форм данных с окном приветствия, информирующим о предстоящих действиях. Нажмите на кнопку Next (Далее).
  • В окне Choose The Dataset You Want To Use (Выберите нужный набор данных) мастер предложит выбрать имеющийся набор данных либо создать новый набор DataSet. В данном примере создан набор DataSet с именем dsEmps (см. рис. 2.9). Все наборы DataSet, создаваемые в мастере, становятся элементами проекта и могут использоваться другими веб-формами или веб-службами внутри этого проекта. Файл DataSet имеет расширение (рис 2.9) Окно Choose The Dataset You Want To Use (Выберите нужный набор данных) мастера форм данных (Data Form Wizard)
  • Нажмите на кнопку Next (Далее) для перехода в окно Choose A Data Connection (Выберите подключение к данным) (см. рис. 2.10). В ниспадающем списке показаны соединения, созданные в проекте до этого. Вы можете выбрать имеющееся подключение либо создать новое. В нашем примере выбрано подключение (рис 2.10) Окно Choose A Data Connection (Выберите подключение к данным) мастера форм данных
  • Нажмите на кнопку New Connection (Новое подключение) для открытия окна Data Link Properties (Свойства подключения к данным), в котором настраивается новое подключение к базе данных.
  • Нажмите на кнопку Next (Далее) для перехода к окну Choose Tables Or Views (Выберите таблицы или образы). Мастер откроет подключение к данным, созданное в предыдущем шаге, и найдет базу данных. Вы можете выбрать таблицы источника данных, к которым должна подключиться веб-форма. Выберите все таблицы и образы, отображаемые в веб-форме; выбор осуществляется в левой области, после чего каждый элемент переносится в правую область окна посредством нажатия на кнопку ">". В нашем примере выбрана таблица tblEmployee (см. рис 2.11(рис 2.11) Окно Choose Tables Or Views (Выберите таблицы или образы) мастера форм данных
  • Нажмите на кнопку Next (Далее) для перехода к окну Choose Tables And Columns To Display On The Form (Выберите таблицы и столбцы, которые необходимо отобразить в форме). Мастер откроет таблицы или образы, выбранные в шаге 9, и покажет их с соответствующими столбцами, доступными для отображения в двойном списке выбора элементов.
  • Отметьте нужные столбцы для отображения в веб-форме.

    При выборе несколько таблиц появится окно Create A Relationship Between Tables (Создать отношение между таблицами), в котором выбираются ключи и отношения таблиц. В нашем примере для отображения выбраны все столбцы таблицы tblEmployee (см. рис. 2.12).

  • Нажмите на кнопку Finish (Готово). Visual Studio .NET сгенерирует законченную форму с именем employees.aspx со всем необходимым кодом в файле Codebehind и элементами управления, вставленными в форму для отображения данных таблицы (рис 2.12) Выбор таблиц и столбцов для отображения в форме
  • На рисунке 2.13 показана веб-форма employees.aspx, отображенная в представлении Design (Дизайн). Элементы управления можно перемещать для нужной настройки их отображения. Код, лежащий в основе формы, довольно высокого уровня, в нем присутствует даже обработка ошибок!

    (рис 2.13) Результирующая веб-форма, сгенерированная мастером форм данных, отображенная в представлении Design (Дизайн)

    Если employees.aspx установлена в качестве стартовой страницы, то нажмите на клавишу F5 для компиляции employees.aspx, чтобы открыть браузер и отобразить веб-форму. На пустой странице будет показана кнопка Load (Загрузить). Нажмите на кнопку Load (Загрузить), и данные отобразятся в браузере (см. рис. 2.14).

    (рис 2.14) Веб-форма employees.aspx, сгенерированная мастером форм данных и отображающая информацию из таблицы tblEmployee

    Использование XML

    В веб-формах можно использовать элемент управления XML, реализующий XML, XSL и XSL Transformations (XSLT). Для получения веб-формы, осуществляющей преобразование XML и XSL, создайте новую веб-форму и в представлении Design (Дизайн) вставьте в форму элемент управления XML (см. рис. 2.15). Элемент управления XML предназначен, главным образом, для интеграции веб-форм в приложении, использующем XSL для инкапсуляции логики представления.

    Элемент управления XML настраивается в окне свойств (см. рис. 2.15). В этом окне указывается файл XML или XSLT/XSL, и при открытии страницы осуществляется преобразование XML и XSL в HTML. Если в элементе управления указаны файлы, они должны являться частью проекта, отображаемого в Solution Explorer.

    (рис 2.15) Отображение в представлении Design (Дизайн) формы с элементом управления XML

    Размещение в форме элемента управления XML ограничено: дизайнер веб-форм позволяет располагать его только в левом верхнем углу представления Design (Дизайн) (см. рис. 2.15), хотя некоторые элементы управления размещаются и под элементами управления XML. Дизайнер веб-форм может не воспринять действительную структуру страницы в документе XSL или XSLT, поэтому его возможности по отображению страницы в представлении Design (Дизайн) сильно ограничены.

    Вернуться к учебному плану