|
Воспользуемся предыдущим примером с передачей данных из формы. Но для обрабатывающей страницы мы установим код, приведенный в листинге 26
|
Скачать 202.43 Kb.
Дата |
31.08.2016 |
Размер |
202.43 Kb. |
|
Работа с объектами HttpRequest и HttpResponse
Сами встроенные объекты HttpRequest и HttpResponse мы уже рассматривали в одном из разделов данной главы. Однако это был лишь обзор их свойств и методов. Сейчас пришло время несколько более подробно рассмотреть механизмы работы с этими встроенными объектами.
Начнем мы с самого простого варианта работы. Как мы помним, объект HttpRequest содержит в себе информацию, которая пришла на сервер от браузера удаленного пользователя. Попробуем получить из этого запроса все данные, которые сможем.
Воспользуемся предыдущим примером с передачей данных из формы. Но для обрабатывающей страницы мы установим код, приведенный в листинге 3.26. Так как ее содержимое создается динамически при помощи объекта Response, а точнее, его метода write, нам не потребуется размещать на разрабатываемой Web-странице какие-либо компоненты.
Листинг 3.26
Public Class WebForm2
Inherits System.Web.UI.Page
tRegion " Web Form Designer Generated Code "
'This call is required by the Web Form Designer.
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
Dim n As String
Dim t As Boolean
Dim i As Integer
n = Request.ApplicationPath
Response.Write("Путь к приложению — " + n)
Response.Write("<�р>Браузер пользователя")
n = Request.Browser.Browser
Response.Write("<�р>Услозное наименование браузера — " + n)
t = Request.Browser.ActiveXControls
If t Then
Response.Write("<�р>Элементы ActiveX включены") Else
Response.Write("<�р>Элементы ActiveX выключены") End If
t = Request.Browser.BackgroundSounds If t Then
Response.Write("<�р>3вук включен") Else
Response.Write("<�р>3вук выключен") End If
t = Request.Browser.Cookies If t Then
Response.Write("
Cookies сохраняются")
Else
Response.Write("
Cookies не сохраняются") End If
t = Request.Browser.JavaApplets If t Then
Response.Write ("
Java-annjieibi выполняются") Else
Response.Write("
Java-anraieTbi не выполняются") End If
n = Request.Browser.Platform Response.Write("
OC пользователя — " + n) i = Request.ContentLength
Response.Write("<�р>Длина полученного пакета — " + i.ToString() + " байтов") n = Request.HttpMethod
Response.Write("<�р>Использованный метод передачи данных — " + n) n = Request.Pathlnfо
Response.Write("<�р>Дополнительные данные в URL- " + n) n = Request.RawUrl
Response.Write("<�р>Полный URL — " + n) n = Request.UrlReferrer.AbsoluteUri
Response.Write ("
URL страницы, с которой пришел пользователь — " + г.) n = Request.UserHostAddress
Response. Write ("<�р>1Р-адрес пользователя — " + n)
End Sub
End Class
Результат работы этого приложения нельзя показать на иллюстрации, так как созданная Web-страница достаточно велика и не может поместиться полностью на экране, поэтому мы просто воспроизведем отображенный текст. Текстовое содержимое обрабатывающей страницы выглядит следующим образом:
Браузер пользователя
Условное наименование браузера — IE
Элементы ActiveX включены
Звук включен
Cookies сохраняются
Java-апплеты выполняются
ОС пользователя — WinNT
Длина полученного пакета — 0 байтов
Использованный метод передачи данных. — GET
Дополнительные данные в URL-
Полный URL —
/form/WebForm2.aspx?fl=%DO%98%DO%B3%DO%BE%Dl%80%Dl%8C&f2=Webmaster@bhv. spb.su
URL страницы, с которой пришел пользователь — http://localhost/form/WebForml.aspx
IP-адрес пользователя — 127.0.0.1
Уже из этого маленького примера становится ясно, сколько информации может предоставить встроенный объект HttpRequest. Однако хотелось бы несколько подробнее остановиться на одном его составном свойстве. Свойство UriReferrer предоставляет разработчику практически полную информацию о том ресурсе, с которого удаленный пользователь перешел на Web-страницу. Думаю, излишне говорить о том, как важна для владельца сайта статистика действий удаленных пользователей. Опираясь на нее, можно правильно расставить акценты в содержимом сайта и больше внимания уделять именно наиболее часто посещаемым страницам. Опираться на действия сторонних сервисов по сбору статистики не всегда представляется возможным. Помимо того, что они являются платными, нет гарантии, что сервис действует безошибочно, и точно так же нет гарантии, что владелец сервиса не будет пользоваться собранными данными в своих целях. Вне всякого сомнения, случаи ошибок сервисов сбора статистики или использования конфиденциальной информации владельцем сервиса чрезвычайно редки, одна к о вероятность возникновения этих ситуаций отличается от нуля, поэтому нельзя ее игнорировать.
О том, как получить данные о системе пользователя, мы уже знаем. Составное свойство Browser объекта HttpRequest позволяет получить эту информацию. Состав этого свойства рассматривался нами ранее. Сейчас пришло Время увидеть, из чего состоит свойство uriReferrer.
Еще раз повторюсь, данное свойство описывает адрес того интернет-ресурса, с которого пользователь перешел на текущую Web-страницу. Как известно, значение подобного свойства имеет тип Uri. Данный тип является составным. Состав значений данного типа приведен ниже.
-
schemeDelimiter. Свойство типа string. Предназначено только для чтения. В нем хранится набор символов, которые отделяют наименование протокола в адресе ресурса, от его основного имени. Чаще всего это комбинация двоеточия и двух обратных слэшей.
-
urishemeFiie. Свойство типа string, предназначенное только для чтения. В него записывается тип протокола, если искомый адрес указывает на некий файл.
-
urishemeFtp. Свойство типа string, предназначенное только для чтения. В него записывается тип протокола, если доступ к предыдущему ресурсу осуществлялся по протоколу FTP.
-
uriShemeGopher. Свойство типа string, предназначенное только для чтения. В него записывается тип протокола, если доступ к предыдущему ресурсу осуществлялся по протоколу Gopher.
-
uriShemeHttp. Свойство типа string, предназначенное только для чтения. В него записывается тип протокола, если доступ к предыдущему ресурсу осуществлялся по протоколу HTTP. Естественно, этот случай будет наиболее часто встречаться, так как переход на Web-страницы обычно производится с других Web-страниц именно по протоколу HTTP.
-
uriShemeHttps. Свойство типа string, предназначенное только для чтения. В него записывается тип протокола, если доступ к предыдущему ресурсу осуществлялся по протоколу Secure HTTP, т. е. были приняты меры по обеспечению секретности передачи данных.
-
uriShemeMailto. Свойство типа string, предназначенное только для чтения. В него записывается тип протокола, если доступ к ресурсу осуществлялся по протоколу SNMP, т. е. ссылка на ресурс активирует почтовый клиент, установленный в системе по умолчанию, для создания электронного письма.
-
uriShemeNews. Свойство типа string, предназначенное только для чтения. В него записывается тип протокола, если искомый ресурс является сообщением новостной конференции, и доступ к нему осуществляется по протоколу NNTP (Network News Transport Protocol).
-
uriSchemeNntp. Свойство абсолютно идентично предыдущему.
-
AbsolutePath. Свойство типа string. В нем содержится часть URL, расположенная после основного адреса ресурса. Чаще всего в нем находится полное наименование файла, включая и путь к нему в среде виртуальных каталогов сервера.
-
AbsoiuteUri. Свойство типа string содержит весь URL искомого ресурса полностью, без каких-либо исключений.
-
Authority. Свойство содержит доменное имя ресурса или его IP-адрес, в зависимости от того, какой именно тип адреса был использован в URL, а также номер порта, если тот был указан в адресе явно. Все это записывается одним значением типа string.
-
Fragment. Свойство типа string. В нем находится наименование закладки документа, являющейся идентификатором для локальных гиперссылок, если она находилась в полном URL. В свойстве записывается не только наименование закладки, но и символ, отделяющий ее от имени документа. Обычно, в этом качестве используется символ решетки — #.
-
Host. В свойстве типа string находится только доменное имя ресурса или его IP-адрес, в зависимости от того, какой именно тип адресации был использован в URL.
-
HostNameType. В свойстве указывается тип имени ресурса, примененный в искомом URL. Свойство имеет тип uriHostNameType. Данный тип является перечислимым, следовательно, значение свойства может принимать одно из следующих значений:
-
Basic. Адрес ресурса успешно обработан, но идентифицировать его тип не представляется возможным;
-
Dns. В URL использовано доменное имя ресурса, удовлетворяющее правилам службы DNS;
-
IPv4. В URL использовано наименование узла, соответствующее правилам четвертой версии протокола IP;
-
IPv6. В URL использовано наименование узла, соответствующее правилам шестой версии протокола IP;
-
Unknown. Тип наименования узла не распознан и не поддерживается системой.
-
isDefauitPort. Логическое свойство типа Boolean. Имеет значение True, если сервер, на котором расположен искомый ресурс, функционирует на порте, номер которого соответствует "умолчальному" значению для данного типа сервера.
-
isFiie. Логическое свойство типа Boolean. Имеет значение True, если искомый URL указывает на некий файл.
-
isLoopBack. Логическое свойство типа Boolean. Имеет значение True, если URL указывает на некий ресурс, расположенный на том же сервере, что и обрабатывающее приложение.
-
isUnc. Логическое свойство типа Boolean. Имеет значение True, если URL составлен по правилам UNC (Universal Naming Convention). Чаще всего подобные адреса встречаются в локальных сетях.
-
LocalPath. Свойство типа string. В нем содержится путь к искомому ресурсу в физической операционной системе той платформы, на которой функционирует сервер. Естественно, если пользователь пришел к нам с другого сервера, в данном свойстве не будет адекватной информации, так как наш сервер не может получить данные о файловой системе другого сервера.
-
PathAndQuery. Свойство типа string. В нем содержится полное наименование файла из URL, включая и путь к нему, и дополнительный запрос, отделяемый от имени файла символом вопросительного знака.
-
Port. Свойство типа integer. В нем хранится номер порта, на котором функционирует сервер, указанный в URL.
-
Query. Свойство типа string. В нем находится строка запроса из URL, включая и стартовый символ вопросительного знака.
-
scheme. Свойство типа string. В нем находится наименование протокола доступа к ресурсу, на который указывает URL. В качестве значений должно быть использовано одно из следующих слов:
-
file. Доступ осуществляется к ресурсу, находящемуся на локальном компьютере;
-
ftp. Доступ осуществляется по протоколу FTP;
-
gopher. Доступ к ресурсу осуществляется по протоколу Gopher;
-
http. Доступ осуществляется по протоколу HTTP;
-
https. Доступ осуществляется по протоколу Secure HTTP;
-
mailto. URL указывает на адрес электронной почты;
-
news. URL указывает на ресурс из новостной конференции, и доступ производится по протоколу NNTP.
-
userEscaped. Свойство логического типа Boolean. Приобретает значение True, если полученная строка, составляющая URL, была ранее пропущена через процедуру URL-кодирования браузером или иным приложением.
-
userinfo. Свойство типа string. В нем располагается информация об удаленном пользователе, который и инициировал данный сеанс работы сообщением новостной конференции, и доступ к нему осуществляется по протоколу NNTP (Network News Transport Protocol).
-
userEscaped. Свойство логического типа Boolean. Приобретает значение True, если полученная строка, составляющая URL, была ранее пропущена через процедуру URL-кодирования браузером или иным приложением.
-
userinfo. Свойство типа string. В нем располагается информация об удаленном пользователе, который и инициировал данный сеанс работы с Web-приложением. В этом свойстве могут храниться имя пользователя, его пароль доступа или иные специфичные именно для него данные.
Помимо перечисленных нами свойств, для объектов типа uri, существует и ряд методов. Следует рассмотреть наиболее часто используемые методы.
-
checkHostName. В качестве параметра методу передается адрес какого-либо хоста в виде значения типа string. Метод проверяет полученный адрес и возвращает тип этого адреса. Возвращаемое значение имеет тип uriHos.tNameType. Естественно, применение этого метода к адресу ресурса, с которого на нашу Web-страницу пришел пользователь, абсолютно идентично использованию свойства Scheme, которое мы уже рассматривали, однако не следует забывать, что при помощи типа URI мы можем обрабатывать не только значение свойства uriReferrer, но и вообще любой URL.
-
checkSchemeName. Данная функция также применима, пожалуй, только для тех URL, которые пользователь вводит самостоятельно. В качестве своего параметра она принимает значение типа string, в котором указывается протокол доступа к какому-либо ресурсу в том виде, как его указал пользователь. Метод проверяет, поддерживается ли запрошенный протокол системой. В случае успешного прохождения теста, возвращается значение True, иначе — False. Как нетрудно догадаться, метод возвращает значение типа Boolean.
-
HexEscape. В качестве параметра метод принимает значение типа char, т. е. один символ, затем выдает строчную запись кода этого символа в шестнадцатеричной системе счисления. Возвращаемое значение имеет тип string. Подобный метод может использоваться для проведения процедуры URL-кодирования.
-
Hexunescape. Метод, по сути, производит обратное действие по отношению к предыдущему. В качестве параметров ему передаются строка и целое число, т. е. параметры имеют тип string и integer соответственно. Целое число — это порядковый номер символа в строке, которая является первым параметром. Метод предполагает, что последовательность символов, начиная с указанного места в строке, является шестнадцате-ричным кодом некоего символа (т. е. подразумевается, что искомая строка-параметр уже была подвергнута процедуре URL-кодирования), и возвращает этот символ. В том случае, если на указанном месте находится символ, который не может рассматриваться как шестнадцатеричная цифра, будет возвращен именно символ, находящийся на указанной позиции, а само целочисленное значение, указывающее не его расположение, будет увеличено на единицу. Понятно, что метод возвращает значение тип а Char.
-
isHexEncoding. Метод получает точно такой же набор параметров, как и предыдущий. Но при этом он всего лишь проверяет, может ли символ, находящийся в искомой строке на указанной позиции, быть частью ше-стнадцатеричного числа. Для этого достаточно, чтобы искомый символ был либо цифрой, либо буквой латинского алфавита в промежутке от "а" до "Г включительно (регистр не имеет значения). Если символ удовлетворяет поставленным условиям, возвращается значение True, иначе — False.
Теперь, зная, какие параметры можно извлечь из свойства uriReferrer, можно получить из него максимально полную информацию, и на ее основе построить статистику перемещения пользователя по сайту, а также знать, какой именно сайт обеспечивает Вам наибольший приток пользователей.
Но вернемся к объекту HttpRequest. В его состав входит еще одно свойство, которое может представлять для нас интерес. Его наименование — ServerVariables. Данное свойство является коллекцией, в которой хранятся все значения, получаемые сервером от браузера пользователя. Часть этих значений вынесена в отдельные свойства объекта HttpRequest, но давайте посмотрим, что же именно хранится в этом свойстве-коллекции. Мы поступим так же, как и в предыдущем примере — всего лишь изменим код Web-страницы, обрабатывающей данные, введенные пользователем в форму. На самом деле, нам эти данные не нужны, нас будет интересовать лишь дополнительная информация. Итак, измененный код обрабатывающей Web-страницы приведен в листинге 3.27.
Листинг 3.27
Public Class WebForm2
Inherits System.Web.UI.Page
#Region " Web Form Designer Generated Code "
'This call is required by the Web Form Designer.
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 names(),vals0
As String Dim i,k As Integer
names=request.ServerVariables.AllKeys For i = 0 To names.GetUpperBound(0) Response.Write("Переменная: " + names(i) + "
") vals = Request.ServerVariables.GetValues(i) For k = 0 To vals.GetUpperBound(0) Response.Write("Значение " + CStr(k) + ": " + vals(k) +
Next k Next i
End Sub
End Class
Сам код достаточно прост. Мы объявляем два массива типа string. В массиве names будут храниться наименования переменных сервера, которые мы получим при помощи метода дикеуз. Второй массив vals предназначен для значений этих переменных. При этом не следует думать, что первый элемент массива vals будет однозначно соответствовать первому элементу массива names. Все несколько сложнее.
Мы не знаем заранее, будет ли каждая переменная простой строкой, или же это будет массив строк. Поэтому мы используем метод Getvaiues, который собирает все значения, соответствующие той или иной переменной. На самом деле в нашем примере все переменные будут представлены единичными значениями строчного типа, поэтому подобный код страдает некоторыми излишествами. Однако в тех случаях, когда заранее неизвестно, будут ли все значения обычными строками или же массивами, рекомендуется все-таки использовать именно подобную конструкцию.
В результате действия этого приложения, в окно просмотра браузера будет выведен следующий текст:
Переменная: ALL_HTTP
Значение 0: HTTP_CONNECTION:Keep-Alive HTTP_ACCEPT:image/gif, image/ x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, */* HTTP_ACCEPT_ENCODING:gzip, deflate HTTP_ACCEPT_ LANGUAGE:ru HTTP__HOST:localhost HTTP_REFERER:http://localhost/ form/WebForml.aspx HTTP_USER_AGENT:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.2914)
П еременная: ALL_RAW
З начение 0: Connection: Keep-Alive Accept: image/gif, image/x-xbitmap, ?image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, I-*/* Accept-Encoding: gzip, deflate Accept-Language: ru Host: localhost TReferer: http://localhost/form/WebForml.aspx User-Agent: Mozilla/4.0 "(compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.2914) Переменная:
APPL_MD_PATH
З начение 0: /LM/W3SVC/1/Root/form
Переменная: APPL_PHYSICAL_PATH
З начение 0: d:\inetpub\wwwroot\form\
AUTH_TYPE
Переменная: AUTH _ USER
Значение 0 :
Переменная: AUTH_PASSWORD
Значение 0:
Переменная
Значение О
Переменная
Значение 0:
Переменная: CERT_COOKIE
Значение 0:
Переменная
Значение О
Переменная
Значение О
Переменная
Значение 0:
Переменная: CERT_SECRETKEYSIZE
Значение 0:
Переменная: CERT_SERIALNUMBER
Значение 0:
Переменная: CERT_SERVER_ISSUER
Значение 0:
Переменная: CERT_SERVER_SUBJECT
Значение 0:
Переменная : LOGON USER
Значение 0
Переменная : REMOTE USER
Значение 0
Переменная : CONTENT TYPE
Значение 0 :
Переменная : GATEWAY INTERFACE
Значение 0: CGI/1.1
Переменная : HTTPS
Значение 0:off
Переменная : HTTPS KEYSIZE
Значение 0 :
Переменная : HTTPS_SECRETKEYS I ZE
Значение 0 :
Переменная : HTTPS SERVER ISSUER
Значение 0:
Переменная : HTTPS SERVER SUBJECT
Значение 0 :
Переменная : INSTANCE_ID
Значение 0 : 1
Переменная : INSTANCE_META_PATH
Значение 0 : /LM/W3SVC/1
Переменная : LOCAL ADDR
Значение 0 : 127.0.0.1
Переменная : PATH_INFO
Значение 0 :/form/WebForm2 . aspx
Переменная : PATH TRANSLATED
Значение 0 :d: \inetpub\wwwroot\form\WebForm2 . aspx
Переменная : QUERY STRING
Значение 0: fl=&Ј2=
Переменная : REMOTE_ADDR
Значение 0: 127.0.0.1
Переменная : REMOTE_HOST
Значение 0: 127.0.0.1
Переменная : REQUEST METHOD
Значение 0: GET
Переменная : SCRIPT_NAME
Значение 0: /form/WebForm2 . aspx
Переменная : SERVER NAME
Значение 0:localhost
Переменная : SERVER PORT
Значение 0: 80
Переменная : SERVER PORT SECURE
Значение 0:
Переменная: CERT FLAGS
Значение 0:
Переменная: CERT ISSUER
Значение 0:
SERVER_PROTOCOL
НТТР/1.1
SERVER_SOFTWARE
Microsoft-IIS/5.1 :
Переменная: URL
Значение 0: /form/WebForm2.aspx I
Переменная: HTTP_CONNECTION
Значение 0: Keep-Alive
Переменная: HTT P_ACCE PT
Значение 0: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, _ application/vnd.ms-excel, application/msword, */*
Переменная: HTTP_ACCEPT_ENCODING
Значение 0: gzip, deflate
Переменная: HTTP_ACCEPT_LANGUAGE
Значение 0: ru
Переменная: HTTP_HOST
Значение О: localhost
Переменная: HTTP_REFERER
Значение О: http://localhost/form/WebForml.aspx
Переменная: HTTP_USER_AGENT
Значение 0: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.2914)
Как видно, практически все серверные переменные дублируются отдельными свойствами объекта HttpRequest, поэтому разработчик в каждом случае k" может сам решать, каким способом ему получать необходимую информацию — через серверные переменные или при помощи отдельных свойств, однако можно заметить, что в некоторых случаях серверные переменные несут несколько более детальную информацию.
Говоря о принципах работы с объектом HttpRequest, нельзя обойти стороной его коллекцию Cookies. Однако для обсуждения данной технологии у нас выделен отдельный раздел, в котором она будет обсуждаться достаточно детально и комплексно, поэтому здесь мы опустим ее рассмотрение. А пока что перейдем к объекту HttpResponse.
Этот объект, как мы уже знаем, позволяет отправлять информацию браузеру пользователя. В наших примерах мы пользовались методом write, который позволяет передавать строки. После того, как браузер получит эти строки, он отобразит их. При этом, естественно, следует осознавать, что браузер будет интерпретировать эти строки как HTML-код. Естественно, при использовании данного метода приходится передавать не только значимую информацию, но и все остальное содержимое Web-страницы, что естественно не слишком удобно. Именно поэтому в наших примерах, приведенных в данном разделе главы, страницы с выводимой информацией выглядели так непрезентабельно.
Но что делать, если нам необходимо выводить информацию на Web-страницах? Дело в том, что компоненты Web Forms (Web-формы) позволяют нам отображать любую информацию, поэтому следует пользоваться в подобных случаях именно ими. Однако может возникнуть еще одна проблема. В зависимости от действий пользователя или иных дополнительных данных, приложению может понадобиться отображать совершенно различные по своей структуре страницы. Можно, конечно, создать на одной странице несколько наборов элементов Web Forms, и в зависимости от ситуации делать видимым один набор и скрывать другие наборы элементов, но очень уж громоздко получается. Действительно, проще все-таки воспользоваться различными Web-страницами. Но остается проблема, как отобразить необходимую страницу в данный момент. Ведь любые переходы по гиперссылкам и формам приводят на некую конкретную страницу. Хорошим решением может быть использование метода Redirect. Он позволяет переадресовать запрос, полученный от браузера удаленного пользователя к любой другой Web-странице, в зависимости от нужд приложения. Нам уже известно, что в качестве параметра данному методу передается строка, в которой записан URL той Web-страницы, которая будет отображена. Таким образом, мы получаем достаточно стройную схему. Рассмотрим это на примере.
Предположим, что мы строим сайт, структура которого будет различна для мужчин и женщин. На стартовой странице при помощи формы мы узнаем пол подключившегося удаленного пользователя, а затем в зависимости от полученных данных отобразим ту или иную Web-страницу. Соответственно, нам потребуется три модуля в нашем новом проекте. Но не будем забегать вперед. Все по порядку.
На первой странице нам потребуется, помимо основных информационных элементов, разместить группу кнопок переключателей. Если бы мы использовали на этой странице только чистый HTML-код, тогда бы нам потребовалось вместо трех страниц создавать четыре. Но, используя компоненты Web Forms (Web-формы), можно обойтись всего тремя. Группа кнопок реализована при помощи компонента RadioButtonList. В его состав входит всего два элемента, причем ни один из них не будет выбран по умолчанию. А свойство AutopostBack нам следует установить в True, чтобы как только пользователь выбрал какую-либо кнопку-переключатель, эти данные были бы переданы на сервер. Итак, HTML-код стартовой страницы приведен в листинге 3.28.
Листинг 3.28
|
|
|