Языки

» Html
» Java Script

» PHP

» Perl

» ASP

» CGI

» Xml

» Dhtml

» VBScript

» Java

» Css

Уроки

» Photoshop

» Corel Draw

» Dreamwawer

» Flash MX

Скачать

» Программы

» Книги

Шаблоны

» Сайтов

» Flash

» Скрипты

Active Server Pages

  » ASP для новичков

     » Главная страница

     » ASP для новичков

Сеансы работы пользователей

Ранее мы уже упоминали об объекте Httpsessionstate, но в этом разделе мы внимательно рассмотрим механизм поддержки сеансов работы пользователей, который снимает с разработчика множество ненужной работы. Как мы уже знаем, подобный класс позволяет идентифицировать пользователя и . отслеживать его работу с сайтом в текущий момент. Разработчик имеет возможность сопровождать пользователя в его непрерывном путешествии по сайту и корректировать действия сайта. Простейший пример — покупка в онлайновом интернет-магазине. С момента выбора пользователем товаров и до его подтверждения покупки, необходимо следить за его действиями на сайте, формировать корзину его заказа, составлять список заказанных товаров, считать сумму заказа и скидки. Естественно, при этом пользователь посетит достаточно много различных Web-страниц, и при переходах между ними, вся накопленная информация должна сохраняться. Для обеспечения этих возможностей можно было бы использовать технологию cookies или взаимодействие с базами данных. Так, в начале работы пользователя с сайтом можно было бы генерировать уникальный cookie, записывать его на машину пользователя, и любая Web-страница могла бы добавлять в него информацию. Однако, как мы знаем, cookie может быть только текстовой строкой, причем размер ее ограничен. Поэтому при больших объемах сохраняемой информации их нельзя использовать. Более того, нужно помнить о том, что пользователи имеют возможность отключить запись cookies на свои машины.

Ограничения на объем хранимой информации могут быть сняты путем использования баз данных. Тем более что без применения баз данных весьма трудно реализовать онлайновый магазин с его стандартным набором возможностей. Можно, но действительно трудно. Однако использование баз данных для сопровождения сеансов работы пользователей потребует хранить не только информацию о товарах, продающихся в магазине, но и дополнительную информацию обо всех действиях пользователей. Это может занять дополнительное время в работе сайта. Конечно, при современных мощностях Web-серверов обработка двух-трех дополнительных таблиц не займет много времени, однако следует осознавать, что в подобную таблицу будет записываться информация не только о совершенных покупках, но и обо всех сеансах работы, которые не закончились покупками. Если учитывать, что обычно только десять процентов посещений сайта заканчиваются покупками (и это еще хороший процент), то объем базы данных, обслуживающей механизм регистрации сеансов пользователей, увеличивается в десять раз по сравнению с ее минимально возможным размером. Эта сложность, естественно, тоже может быть ликвидирована, однако это потребует дополнительных действий со стороны администратора или дополнительного служебного Web-приложения.

Итак, нетрудно догадаться, к чему я веду. Действительно, ASP.NET предоставляет разработчику готовый механизм отслеживания и сопровождения сеансов. При этом разработчику даже нет нужды досконально разбираться в его способах работы, достаточно просто пользоваться им как коллекцией и применять его методы и свойства. В нескольких примерах этой книги мы уже использовали объект HttpSessionstate в качестве хранилища данных, которые должны быть переданы от одной Web-страницы к другой, поэтому в этом разделе мы не будем еще раз рассматривать подробно эту процедуру. Нам следует научиться правильно управлять сессиями.

Рассмотрим еще раз пример с организацией сеансов посредством cookies. Даже если не упоминать об ограничениях на объем хранимой информации, все равно есть еще одна проблема. Когда мы записываем в cookie уникальный идентификатор сеанса, это означает, что каждая Web-страница, участвующая в обработке сеанса, получит данный идентификатор, и на его основе будет строить свою работу. Но что делать, если пользователь внезапно прервет свою работу, и зайдет на сайт две недели спустя? Его идентификатор сеанса сохранится, и сайт будет работать с ним так, как будто никакого разрыва н е происходило. А за прошедшее время могут измениться, предположим, цены на заказанные товары. Более того, вполне вероятна ситуация, когда заказанный пользователем две недели назад товар уже закончится на складе. Следовательно, необходимо четко знать, сколько времени может длиться один сеанс.

При использовании объекта HttpSessionstate мы можем устанавливать максимальную продолжительность сеанса, а также принудительно завершать его. Возможность жесткого завершения сеанса придется весьма кстати в тех случаях, когда пользователю разрешается проводить несколько сеансов работы с сайтом последовательно. Обратимся опять к примеру онлайнового магазина. Когда пользователь завершил покупку, его следует перевести опять на стартовую страницу сайта, откуда он и начинал работу (вдруг он сделает еще одну покупку?). Но при этом его предыдущий сеанс следует закрыть, так как покупки одного пользователя должны отделяться друг от друга.

Время жизни сеанса задается при помощи свойства Timeout, значением которого является целое число. Это и есть максимальная длительность сеанса, выраженная в минутах. Таким образом, если мы предполагаем, что пользователь будет оформлять покупку на сайте не более трех часов (а в моей практике был случай, когда пользователь собирал достаточно объемный заказ около трех часов), то значение этого свойства должно равняться ста восьмидесяти. Принудительно завершить сеанс работы можно при помощи метода Abandon. Однако перейдем от описания объекта к примерам работы с ним. Попробуем сделать очень маленький прототип онлайнового магазина.

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

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

Левый столбец предназначен для независимых переключателей, во втором столбце будет находиться наименование товара, а в третьем — его цена. А под таблицей мы поместим кнопку, которая будет переадресовывать пользователя к его корзине заказа. HTML-код созданной нами страницы в том виде, как он создан средой разработки Visual Studio .NET, приведен в листинге 3.34.

Листинг 3.34

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForml.aspx.vb" Inherits="trans.WebForml"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<title>06pa6oTKa ceaHcoB</title>

<meta content="Microsoft Visual Studio.NET 7.0" name="GENERATOR">

<meta content="Visual Basic 7.0" name="CODE_LANGUAGE">

<meta content^"JavaScript" name="vs_defaultClientScript">

<meta content=http://schemas.microsoft.com/intellisense/ie5

name="vs_targetSchema">

</HEAD>

<body MS_POSITIONING="GridLayout">

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

<asp:button id="Buttonl" style="Z-INDEX: 101; LEFT: 52px; POSITION: absolute;

TOP: 298px" runat="server" Width="292px" Height="24px" Text="nocMOTpeTb корзину 3aKa3a"x/asp:button> <TABLE style="Z-INDEX: 102; LEFT: 37px; WIDTH: 540px;

POSITION: absolute; TOP: 25px; HEIGHT: 214px" cellSpacing="l" cellPadding="l" width="540" border="l" xmlns="http://schemas.microsoft.com/intellisense/ie5">

<TR>

<TD style="WIDTH: 81px">

Заказать </TD>

<TD style="WIDTH: 266px">

Наименование товара </TD>

<TD>

Цена </TD>

</TR>

<TR>

<TD style="WIDTH: 81px">

<asp:checkbox id="CheckBoxl" runat="server"x/asp:checkbox> </TD>

<TD style="WIDTH: 266px">

Цифровой фотоаппарат </TD>

<TD> 850

</TD>

</TR>

<TR>

<TD style="WIDTH: 81px">

<asp:checkbox id="CheckBox2" runat="server"x/asp:checkbox>

</TD>

<TD style="WIDTH: 266px">

Ноутбук </TD>

<TD>

2200

</TD>

</TR>

<TR>

<TD style="WIDTH: 81px">

<asp:checkbox id="CheckBox3" runat="server"x/asp:checkbox>

</TD>

<TD style="WIDTH: 266px">

Сканер </TD>

<TD>

120

</TD>

</TR>

<TR>

<TD style="WIDTH: 81px">

<asp:checkbox id="CheckBox4" runat="server"x/asp:checkbox>

</TD>

<TD style="WIDTH: 266px">

Монитор </TD>

<TD>

250

</TD>

</TR>

<TR>

<TD style="WIDTH: 81px">

<asp:checkbox id="CheckBox5" runat="server"x/asp:checkbox>

</TD>

<TD style="WIDTH: 266px">

CD-Writer </TD>

<TD>

40

</TD>

</TR>

</TABLE>

</form>

</body>

</HTML>

После того, как пользователь выберет необходимые товары, он нажмет на кнопку, размещенную под таблицей. Следовательно, нам необходимо выделить отмеченные пользователем переключатели, и на основе полученной информации сформировать массив, в котором будут помечены выбранные товары. А затем этот массив передать следующей Web-странице в составе объекта Httpsessionstate. Весь код, реализующий эти действия, приведен в листинге 3.35.

Листинг 3.35

Public Class WebForml

Inherits System.Web.UI.Page

Protected WithEvents CheckBoxl As System.Web.UI.WebControls.CheckBox

Protected WithEvents CheckBox2 As System.Web.UI.WebControls.CheckBox

Protected WithEvents CheckBox3 As System.Web.UI.WebControls.CheckBox

Protected WithEvents CheckBox4 As System.Web.UI.WebControls.CheckBox

Protected WithEvents CheckBoxS As System.Web.UI.WebControls.CheckBox

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

Region " Web Form Designer Generated Code "

'This call is required by the Web Form Designer.

<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeCcmponent()

End Sub

Private Sub Page_Init(ByVal sender

As System.Object, ByVal

e As System.EventArgs) Handles MyBase.Init

'CODEGEN: This method call is required by the Web Form Designer

'Do not modify it using the code editor. InitializeComponent()

End Sub

#End Region

Private Sub Page_Load(ByVal sender As System.Object, ByVal

e As System.EventArgs) Handles MyBase.Load

'Put user code to initialize the page here

End Sub

Private Sub Buttonl_Click(ByVal sender

As System.Object, ByVal

e As System.EventArgs) Handles Buttonl.Click

Dim tov(5) As Integer Dim i As Integer For i = 0 To 4

tov(i) = 0 Next

Session.RemoveAll() Session.Timeout = 60 If CheckBoxl.

Checked Then

tov(O) = 1 End If If CheckBox2.Checked Then

tov(l) = 1 End If If CheckBox3.Checked Then

tov(2) = 1 End If

If CheckBox4.Checked Then

tov(3) - Г End If If CheckBoxS.Checked Then

tov(4) = 1 End If

Session.Add("goods", tov) Response.

Redirect("WebForm2.aspx")

End Sub

End Class

Теперь рассмотрим этот код. При нажатии пользователем на кнопку, сначала создается целочисленный массив из пяти элементов. Если пользователь выбрал какой-либо товар, соответствующему элементу массива будет придано единичное значение. Но перед этим очищается вся коллекция объекта Session, и устанавливается время жизни этого объекта, равное одному часу.

Затем приложение анализирует переключатели, и в зависимости от значения их свойства, checked изменяет соответствующие элементы массива.

После того, как массив будет сформирован, он передается в коллекцию объекта session, а затем пользователь переадресовывается на следующую Web-страницу с наименованием "WebForm2.aspx".

Вторая Web-страница отображает состояние корзины заказа. На ней нам потребуется отображать список выбранных пользователем товаров и общую сумму заказа. Так как нам заранее неизвестно, сколько именно товаров выберет пользователь, мы не можем использовать стандартную таблицу, как на первой Web-странице. Можно было бы использовать компонент таЫе с вкладки Web Forms (Web формы), который поддается динамическому изменению основных его свойств, но о табличных компонентах мы узнаем в следующем разделе. А пока воспользуемся компонентом Repeater.

Этот компонент используется в тех случаях, когда разработчику необходимо разместить на Web-странице несколько повторяющихся блоков с одинаковой структурой. При этом структура повторяющихся блоков может быть достаточно сложной, что позволяет практически все возможности HTML, органы ввода информации, формы и т. д.

Единственное неудобство использования компонента Repeater состоит в том, что настраивать его структуру придется вручную, изменяя HTML-код страницы. Но о том, как придется изменить этот код, проще будет рассказывать после того, как будет приведен листинг. А пока перейдем к дальнейшему оформлению Web-страницы.

Нам понадобится еще один компонент Label, в котором мы будем указывать сумму заказа пользователя, и кнопка, при нажатии на которую польз о ватель будет подтверждать покупку. В общем виде HTML-код этой страницы на стадии разработки приведен в листинге 3.36.

Листинг 3.36

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm2.aspx.vb" Inherits="trans .WebForm2"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<title>KopsMHa 3aKasa</title>

<meta name="GENERATOR" content="Microsoft Visual Studio. NET 7.0">

<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">

<meta name="vs_defaultClientScript" content="JavaScript">

<meta name="vs_targetSchema" con-tent="http: //schemas.microsoft.com/intellisense/ie5">

</HEAD>

<body MS_POSITIONING="GridLayout">

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

<asp: Repeater id="Repeaterl" runat=" server "> <ItemTemplate>

<%# Container. Dataltem %>

</ItemTemplate> </asp:Repeater>

<asp:Label id="Labell" style="Z-INDEX: 101; LEFT: 31px;

POSITION: absolute;

TOP: 160px" runat="server"> Сумма заказа</азр: Label>

<asp:Button id="Buttonl" style="Z- INDEX: 102; LEFT: 23px;

POSITION: absolute;

TOP: 203px" runat=" server"

Text= "Подтвердить заказ" Width="141px" Height="24px"x/asp:Button>

</form>

</body>

</HTML>

Сам код, приведенный в этом листинге, достаточно прост, но необходимо пояснить механизм использования компонента Repeater. При переносе его на разрабатываемую Web-страницу, в ее HTML-код вставляется пара тегов — <asp: Repeater > И его закрывающая пара </asp: Repeaterx Между ними разработчик должен сам описать структуру отображаемых данных.

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

Образец форматирования элементов, входящих в состав компонентаRepeater, размещается между тегами <ItemTemplate> И </ItemTemplate>.

В нашем случае мы будем отображать текстовые строки как отдельные абзацы. Поэтому в качестве оформления мы использовали объявление абзаца при помощи тега <р> и его закрывающей пары </р>. А между этими тегамиразмещается еще один служебный Тег — <%# Container. Dataltem %>.

Именно он является обозначением тех данных, которые будут помещены в компонент Repeater. Конечно, на этом программирование данного объекта не заканчивается, так как нам необходимо еще передать данные в этот объект. Но эта процедура описывается в самом классе, который реализует данную страницу. Его код приведен в листинге 3.37.

Листинг 3.37

Public Class WebForm2

Inherits System.Web.UI.Page

Protected WithEvents Labell

As System.Web.UI.WebControls.Label Protected WithEvents Buttonl

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

As System.Web.UI.WebControls.Repeater

iRegion " Web Form Designer Generated Code "

'This call is required by the Web Form Designer.

<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

End Sub

Private Sub Page_Init(ByVal sender

As System.Object, ByVal

e  As System.EventArgs) Handles MyBase.Init

'CODEGEN: This method call is required by the Web Form Designer 'Do not modify it using the code editor. InitializeComponent() End Sub

#End Region

Private Sub Page_Load(ByVal sender As System.Object, ByVal

e As System.EventArgs) Handles MyBase.Load

'Put user code to initialize the page here

Dim values As New ArrayList()

Dim tov(5) As Integer

Dim s As Integer

s = 0

tov = Session.ItemC'goods")

If tov(O) = I Then

values.Add("Цифровой фотоаппарат")

s = s + 850 End If If tov(l) = 1 Then

values.Add("Ноутбук")

s = s + 2200

End If

If tov(2) = 1 Then

values.Add("Сканер")

s = s + 120 End If If tov(3) = 1 Then

values.Add("Монитор")

s = s + 250 End If If tov(4) = 1 Then

values.Add("CD-Writer ")

s = s + 40 End If

Repeaterl.DataSource = values Repeaterl.DataBind()

Labell.Text = "Сумма заказа " + Str(s)

End Sub

Private Sub Repeaterl_ItemCommand(ByVal source

As System.Object, ByVal

e As System.Web.UI.WebControls.

RepeaterCommandEventArgs) Handles Repeaterl.ItemCommand

End Sub

Private Sub Buttonl_Click(ByVal sender As System.Object, ByVal

e As System.EventArgs) Handles Buttonl.Click

Response.Redirect("WebForm3.aspx")

End Sub

End Class

Связывание объекта Repeater с данными должно происходить при загрузке страницы, чтобы она могла быть отображена сразу со всеми данными. По этому мы использовали обработчик события Pa.ge_Load. В качестве источни-»ка данных для объекта Repeater мы приготовили экземпляр объекта ArrayList с наименованием values. Но перед тем как связать его с иско-"мым объектом Repeater, этот массив необходимо заполнить. Для этого мы используем уже знакомый нам по первой Web-странице этого проекта массив tov, в котором единицами отмечены элементы, соответствующие товарам, выбранным пользователем. Мы объявляем этот массив в процедуре, но заполняем его, опираясь на его копию, сохраненную в объекте session. Для этого мы используем следующий оператор:

., tov = Session. Item ("goods")

А затем, последовательно проверяя значения элементов этого массива, до-:бавляем наименования выбранных пользователем товаров в массив values и подсчитываем общую сумму покупки.

После того, как все элементы массива проверены, остается сформировать внешний вид Web-страницы. Сначала мы займемся объектом Repeater. Все данные для него находятся в массиве values, следовательно, этот массив и будет служить источником данных. Для того чтобы связать эти два объекта, мы используем следующий оператор:

Repeaterl.DataSource = values

А для того чтобы данные были отображены, следует вызвать метод DataBind. И все, компонент Repeater правильно обработан, и его данные адекватно отображены. После этой операции отображение суммы покупки при помощи компонента Label является действительно тривиальной задачей.

Итак, состояние корзины заказа правильно отображено на Web-странице. Что дальше? Пользователь для того чтобы подтвердить заказ, нажимает на кнопку, которая размещена в нижней части Web-страницы. Обработчик нажатия на эту кнопку переадресовывает посетителя сайта к третьей и последней Web-странице, входящей в состав нашего проекта.

На заключительной Web-странице достаточно поместить всего один компонент Label, который будет информировать покупателя о том, что его заказ принят. Таким образом, HTML-код страницы получается очень простым. Он приведен в листинге 3.38.

Листинг 3.38

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm3.aspx.vb" Inherits="trans.WebForm3"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<titlex/title>

<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">

<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">

<meta name="vs_defaultClientScript" content="JavaScript">

<meta name="vs_targetSchema" content="http://schemas.microsoft.com/ intellisense/ie5">

</HEAD>

<body MS_POSITIONING="GridLayout">

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

<asp:Label id="Labell" style="Z-INDEX: 101; LEFT: 40px; POSITION: absolute;

TOP: 32px" runat="server" Width="324px" Height="19px"> Ваш заказ npMHHT</asp:Label>

</form>

</body>

</HTML>

Но эта Web-страница нужна не только для того, чтобы отобразить некий текст. Вместе с окончанием процесса покупки необходимо закончить сеанс работы пользователя и уничтожить используемый экземпляр объекта session. Эти действия выполняются при загрузке страницы, что хорошо видно из листинга 3.39.

Листинг 3.39

Public Class WebForm3

Inherits System.Web.UI.Page

Protected WithEvents Labell As System.Web.UI.WebControls.Label

#Region " Web Form Designer. Generated Code "

'This call is required by the Web Form Designer.

<System.Diagnostics.DebuggerStepThrough()>

Private Sub InitializeComponent()

End Sub

Private Sub Page_Init(ByVal sender

As System.Object, ByVal

e As System.EventArgs) Handles MyBase.Init

'CODEGEN: This method call is required by the Web Form Designer

'Do not modify it using the code editor. InitializeComponent()

End Sub

#End Region

Private Sub Page_Load(ByVal sender

As System.Object, ByVal

e As System.EventArgs) Handles MyBase.Load

'Put user code to initialize the page here Session.Abandon()

End Sub

End Class

Легко заметить, что для уничтожения сеанса мы используем метод Abandon, о котором уже говорилось в этом разделе.

А теперь посмотрим, в каком виде это приложение показывается пользователю. Настоящий HTML-код первой Web-страницы приведен в листинге 3.40.

Л истинг 3.40

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<title>06pa6oTKa ceaHCOB</title>

<meta content="Microsoft Visual Studio.NET 7.0" name="GENERATOR">

<meta content="Visual Basic 7.0" name="CODE_LANGUAGE">

<meta content="JavaScript" name="vs_defaultClientScript">

<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema ">

</HEAD>

<body MS_POSITIONING="GridLayout">

<form name="Forml" method="post" action="WebForml.aspx" id="Forml">

<input type="hidden" name="__VIEWSTATE" value=

"dDwtNzgwNjMyOTAzOztsPENoZWNrQm94MTtDaGVjaOJveDI

7Q2hlY2tCb3gzOONoZWNrQm94 NDtDaGVjaOJveDU7Pj4=" />

<input type="submit" name="Buttonl"

value="nocMOTpeTb корзину заказа" id="Buttonl" style="height:24px;width:292px;

Z-INDEX: 101; LEFT: 52px; POSITION: absolute; TOP: 298px" />

<TABLE style="Z-INDEX: 102; LEFT: 37px;

WIDTH: 540px; POSITION: absolute;

TOP: 25px; HEIGHT: 214px" cellSpacing="l" cellPadding="l" width="540" border="l" xmlns="http://schemas.microsoft.com/ intellisense/ie5">

<TR>

<TD style="WIDTH: 81px">

Заказать

</TD>

<TD style="WIDTH: 266px">

Наименование товара </TD> <TD>

Цена

</TD>

</TR>

<TR>

<TD style="WIDTH: 81px">

<input id="CheckBoxl" type="checkbox" name="CheckBoxl" />

</TD>

<TD style="WIDTH: 266px">

Цифровой фотоаппарат

</TD>

<TD>

850

</TD>

</TR>

<TR>

<TD style="WIDTH: 81px">

<input id="CheckBox2" type="checkbox" name="CheckBox2" />

</TD>

<TD style="WIDTH: 266px">

Ноутбук

</TD>

<TD>

2200

</TD>

</TR>

<TR>

<TD style="WIDTH: 81px">

<input id="CheckBox3" type="checkbox" name="CheckBox3"

</TD>

<TD style="WIDTH: 266px">

Сканер :

</TD>

<TD>

120

</TD>

</TR>

<TR>

<TD style="WIDTH: 81px">

<input id="CheckBox4" type="checkbox" name="CheckBox4"

</TD>

<TD style="WIDTH: 266px">

Монитор </TD> <TD> 250

</TD>

</TR>

<TR>

<TD style="WIDTH: 81px">

<input id="CheckBox5" type="checkbox" name="CheckBox5"

</TD>

<TD style="WIDTH: 266px">

CD-Writer </TD>

<TD>

40

</TD>

</TR>

</TABLE>

</form>

</body>

</HTML>

После того, как пользователь при помощи независимых переключателей выберет необходимые товары и нажмет на кнопку Посмотреть корзину заказа, в браузер будет послана вторая Web-страница, код которой приведен в листинге 3.41.

Листинг 3.41 ;

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<title>Kop3MHa 3aKasa</title>

<meta name="GENERATOR" content="Microsoft Visual Studio. NET 7.0">

<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">

<meta name="vs_defaultClientScript" content="JavaScript">

<meta name="vs_targetSchema" content="http: //schemas .microsoft . com/intellisense/ie5">

</HEAD>

<body MS_POSITIONING="GridLayout">

<form name="Forml" method="post" action="WebForm2 .aspx" id="Forml">

<input type="hidden" name=" _ VIEWSTATE" value=

"dDwtMTEwODkwMjMwOTtOPDtsPGk8MT47PjtsPHQ802w8a

TwxPjtpPDM+Oz47bDxOPHA8bDxf

IU10ZWlDb3VudDs+02w8aTwzPjs+PjtsPGk8MD47aTwxPjt

pPDI+Oz47bDxOPDtsPGk8MD47P

jtsPHQ8QDzQptC40YTRgNC+OLLQvtC5INGEOL7RgtC+OLDQ

v9C/OLDRgNCwOYI7Pjs7Pjs+Pj

tOPDts-PGk8MD47PjtsPHQ8QDzQodC60LDQvdC10YA7Pjs

7Pjs+PjtOPBtsPGk8MD47PjtsPHQ

8QDxDRClXcmlOZXIgOz470z47Pj47Pj47dDxwPHA8bDxUZX

hOOz47bDzQodGDOLzQvNCwINC3

OLDQutCwOLfQsCAgMTAxMDs+Pjs+Ozs+Oz4+Oz4+Oz4==" />

Цифровой фотоаппарат

Сканер

CD-Writer

<span id="Labell" style="Z-INDEX: 101; LEFT: 31px;

POSITION: absolute;

TOP: 160рх">Сумма заказа 1010</span>

<input type="submit" name="Buttonl"

value="noflTBepflHTb заказ" id="Buttonl"

style="height:24px;width:141px;

Z-INDEX: 102; LEFT: 23px;

POSITION: absolute;

TOP: 203px" />

</form>

</body>

</HTML>

На этой Web-странице расположена кнопка Подтвердить заказ, нажав на которую пользователь завершает покупку. Для этого, как мы знаем, создается третья и последняя Web-страница нашего проекта. Она достаточно проста, но все же приведем для полноты картины и ее HTML-код. Он показан в листинге 3.42.

Листинг 3.42

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<titlex/title>

<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">

<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">

<meta name="vs_defaultClientScript" content="JavaScript">

<meta name="vs_targetSchema" con-tent="http://schemas.microsoft.com/intellisense/ie5">

</HEAD>

<body MS_POSITIONING="GridLayout">

<form name="Forml" method="post" action="WebForm3.aspx" id="Forml">

<input type="hidden" name="__VIEWSTATE" value="dDwtMTU30DAzNTQ4MDs7Pg=="

<span id="Labell" style="height:19px;width:324px;

Z-INDEX: 101; LEFT: 40px;

POSITION: absolute; TOP: 32рх">Ваш заказ принят</зрап>

</form>

</body>

</HTML>

И на этом мы можем закончить рассмотрение механизмов поддержки сеансов работы пользователей, которые используются в ASP.NET.

Сохранить документ

Сохранить документ (.doc)

Распечатать документ

Напечатать

 

Следующий урок


Общение
» Чат

» Форум

Реклама 

Здесь может быть Ваша реклама

Поиск

» Поиск

Статистика 

Связь
» Web дизайнер

» Ваша реклама

» Отзывы

» О проекте

 



Сайт управляется системой uCoz