Академия Специальных Курсов по Компьютерным Технологиям
    Главная страница Послать письмо
 
AskIt.ru  
   
   
   
   
   
   
 
 
  Главная / Заказные курсы / Разработка Web-приложений ASP.NET 2.0 в Visual Studio.NET 2005
 
 

Получить учебные материалы по этому курсу


<-- Назад Читать дальше -->

5. Работа с кодом в Web-форме

Размещение кода на страницах codebehind и внутри Web-формы (inline) в ASP.NET, серверные и клиентские событийные процедуры в ASP.NET, события формы, атрибут AutoPostBack

Приложения ASP.NET требуют работы с кодом. Код можно:

·        помещать прямо вместе с информацией разметки (mixed). Такой метод использовался в обычном ASP, но читать код таких страницы очень сложно.

·        помещать в отдельный раздел файла контента (inline) - обычно в секцию SCRIPT;

·        помещать код в отдельный файл codebehind. Это - наиболее удобный метод, и именно он используется в ASP.NET по умолчанию.

Метод inline обычно используется на страницах, мигрировавших с обычного ASP. Выглядеть его применение может примерно так:

<HTML>

<asp:Button id="btn" runat="server"/>

...

</HTML>

<SCRIPT Language="vb" runat="server">

   Sub btn_Click(s As Object, e As EventArgs) _

   Handles btn.Click

   ...

   EndSub

Страницы codebehind позволяют разделить программную логику и дизайн страницы. По умолчанию у страницы codebehind - то же имя, что и Web-формы, с добавлением расширения *.vb или *.cs. На странице codebehind код может быть только на одном языке.

Web-форма и страница codebehind образуют единое целое. Связь между ними настраивается при помощи директивы <%@Page>. В этой директиве к codebehind относятся три атрибута:

·        codebehind - атрибут, используемый по умолчанию для указания на codebeind страницу;

·        src - используется тогда, когда вы хотите, чтобы страница codebehind компилировалась всякий раз при вызове приложения. Это - очень большой проигрыш в производительности и поэтому такой подход обычно не используется.

·        inherits - позволяет странице aspx наследовать классы со страницы codebehind. Значение этого атрибута чувствительно к регистру.

Теперь - о событийных процедурах.

Все программирование теперь основана на событиях, а это значит, что для работы вашего приложения необходимо определять нужные события и прописывать для них код. Как правило, события возникают в ответ на действия пользователя, например, нажатие на кнопку, установку флажка и т.п.

Существует два типа событийных процедур: клиентские и серверные. Клиентские процедуры обрабатываются на компьютере клиента. При возникновении события никакой код на сервер не посылается. Вместо этого обработкой события занимается броузер клиента.

Для клиентских процедур можно использовать только элементы управления HTML. Кроме того, из клиентских процедур нельзя обратиться к серверным ресурсам. Есть определенные сложности и из-за отличий в версиях броузеров. Однако клиентские процедуры работают очень быстро и не требуют дополнительного обмена информацией с сервером. Их обычное назначение - проверка ввода пользователя. Чаще всего для них используется код скрипта на языке JScript, например:

<SCRIPT language="javascript">

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

<SCRIPT language="vb" runat="server">

Работа с серверной событийной процедурой производится в два этапа:

·        первый этап - создание элемента управления, который сможет генерировать соответствующие события;

·        второй этап - написание кода для нужного события на codebehind странице.

При двойном щелчке по элементу управлению VS.NET выполняет следующие действия:

·        объявляет переменную (ее имя соответствует значению свойства ID этого элемента управления);

·        создает шаблон событийной процедуры для события по умолчанию.

Как выглядит шаблон процедуры, зависит от значения атрибута AutoEventWireUp в страничном теге Page. Если он установлен в False (по умолчанию), то для событийных процедур используется ключевое слово Handles (оно позволяет назначать несколько процедур одному событию). Если этот атрибут стоит в True - используются специальные имена процедур, как в VB6.

Пример применения Handles:

предположим, что у нас была единственная кнопка с таким кодом:

<form id="form1" method="post" runat="server">

  <asp:Button id="cmd1" runat="server"/>

</form>

Для нее объявляется с параметром WithEvents специальная объектная переменная типа WebControls.Button:

Protected WithEvents cmd1 As  System.Web.UI.WebControls.Button

А затем создается событийная процедура:

Private Sub cmd1_Click(ByVal s As System.Object,   ByVal e As System.EventArgs) _

 Handles cmd1.Click

...

End Sub

Все события передают событийной процедуре два параметра: первый - объект-отправитель события, второй  может содержать в себе дополнительную информацию о событии. Например, для элемента управления ImageButton вместо стандартного EventArgs передается параметр типа ImageClickEventArgs, в котором содержится информация о координатах щелчка мышью:

Sub img_OnClick(ByVal s As System.Object, _

  ByVal e As System.Web.UI.ImageClickEventArgs) _

 Handles ImageButton1.Click

  Label1.Text = e.X & ", " & e.Y

End Sub

В C# слово Handles не используется и синтаксис немного другой.

Чаще всего в событийной процедуре вам потребуется забрать информацию, которую пользователь ввел/выбрал при помощи элементов управления. Все это делается точно так же, как и в обычных приложениях Windows, при помощи свойств элементов управления. Например, если у нас есть текстовое поле txtName, то забрать необходимое значение можно так:

Dim strGreeting As String = "Hello " & txtName.Text

Для вывода информации на форме проще всего также воспользоваться свойствами элементов управления:

lblGreeting.Text = "new text"

В обычном ASP необходимо было использовать коллекцию Request.Forms для получения информации об элементах управления и Response.Write - для изменения их свойств. В ASP.NET эта возможность оставлена для обратной совместимости, но рекомендуется использовать обычные свойства.

Теперь - о событиях уровня страницы.

При обращении пользователя к странице ASP.NET проходит целая серия событий:

·        Page_Init - страница инициализируется, на ней размещаются и элементы управления;

·        Page_Load - страница передается в броузер пользователю;

·        события элементов управления, например, TextBox1_Changed или Button1_Click;

·        Page_Unload - страница закрывается в броузере пользователя.

Процесс передачи информации формы на сервер называется Postback. По умолчанию он возникает только при возникновении события Click для кнопки. Однако можно для любого элемента управления установить свойство AutoPostBack в true, и тогда в ответ на событие этого элемента управления произойдет PostBack. Например, чтобы сразу поле выбора пользователем элемента в списке эта информация передавалась на сервер, код для списка может быть таким:

<asp:DropDownList id="ListBox1" runat="server"

        AutoPostBack="True">

 <asp:ListItem>First Choice</asp:ListItem>

 <asp:ListItem>Second Choice</asp:ListItem>

</asp:DropDownList>

Проверку того, открывалась ли страница в первый раз, или она была загружена повторно, можно производить при помощи свойства Page.IsPostBack. Если это свойство стоит в False, то страница открыта в первый раз, если в True - то не в первый. Обычно такую проверку помещают в код событийной процедуры для Page_Load, чтобы не грузить, к примеру, дважды одни и те же значения в ниспадающий список.

В ASP.NET, как в обычном Windows - приложении, для определения свойств одного элемента управления можно использовать свойства другого (например, настроенного пользователем). Для этой цели используются специальные связывающие теги. Например, тег, который позволили бы настроить значение свойства Text для надписи Label на форме в зависимости от того, что выбрано пользователем в списке lstOccupation, может выглядеть так:

<asp:Label id="lblSelectedValue" runat="server"

  Text="<%# lstOccupation.SelectedItem.Text %>" />

Полный код может выглядеть так:

<form runat="server">

 <asp:DropDownList id="lstOccupation"

    autoPostBack="true" runat="server" >

   <asp:ListItem>Program Manager</asp:ListItem>

   <asp:ListItem>Tester</asp:ListItem>

   <asp:ListItem>User Assistance</asp:ListItem>

 </asp:DropDownList>

  <p>You selected: <asp:Label id="lblSelectedValue"

    Text="<%# lstOccupation.SelectedItem.Text %>"

   runat="server" />

 </p>

</form>

Необходимо обратить внимание на обязательное использование AutoPostBack для списка - иначе изменение текстового поля произойдет только после отправки данных на сервер.

Для того, чтобы такие связывающие теги работали, необходимо в событийной процедуре Page_Load вызвать метод DataBind либо для самого элемента управления, либо для всей странице (тогда он будет применен ко всем элементам управления на странице):

В этом примере мы применяем его для нашего элемента управления:

Sub Page_Load (s As Object, e As EventArgs) _

 Handles MyBase.Load

 lblSelectedValue.DataBind()

End Sub

 

 

   
   
   
   
   
   
   
   
   
   
 
<-- Назад Читать дальше -->

Получить учебные материалы по этому курсу


 
© 2004-2008, Академия Специальных Курсов
по Информационным Технологиям
.
Все права защищены.

Разработка NevaStudio
г. Санкт-Петербург, Васильевский остров,
20-я линия, д. 7
Офис 101, 2-й этаж
Телефон: 8(812)922-47-60
E-mail: info@askit.ru