Все значения, предоставляемые, когда пользователь заполняет содержимое страницы <FORM> или вводит значение после URL-адреса в адресной строке браузера, используются сценарием ASP через коллекции Form и QueryString. Это простой способ доступа к значениям в коде ASP.
1. Общие методы доступа к коллекциям ASP.
Большинство коллекций ASP аналогичны обычным коллекциям VB. По сути, они представляют собой массивы значений, но доступ к ним осуществляется с помощью ключа текстовой строки (который не чувствителен к размеру) и целочисленного индекса. Таким образом, если веб-страница клиента содержит <FORM> следующим образом:
<FORM ACTION="show_request.asp" METHOD="POST">
Имя:<INPUT TYPE="ТЕКСТ" NAME="Имя">
Фамилия:<INPUT TYPE="ТЕКСТ" NAME="Фамилия">
<ТИП ВХОДА = «ОТПРАВИТЬ» ЗНАЧЕНИЕ = «Отправить»>
</FORM>
Вы можете получить доступ к значению в его элементе управления, обратившись к коллекции форм ASP:
strFirstName = Request.Form("FirstName")
strLastName = Request.Form("LastName")
также может использовать целочисленный индекс элементов управления в форме. Диапазон индекса начинается с первого элемента управления, определенного в HTML, а затем сортируется в соответствии с порядком определения:
strFirstName =. Запрос.Форма( 1)
strLastName = Request.Form(2)
Однако последний метод использования целочисленной индексации не рекомендуется, поскольку при изменении элемента управления в HTML или вставке нового элемента управления код ASP получит неправильное значение. Более того, это чрезвычайно сбивает с толку людей, читающих код.
1) Чтобы получить доступ ко всем значениям коллекции,
вы можете превратить серию значений во всей Форме в одну символьную переменную, ссылаясь на коллекцию без предоставления ключа или индекса.
StrAllFormContent = Request.Form
Если текстовое поле содержит значения Priscilla и Descartes, оператор Request.Form вернет следующие символы:
FirstName=Priscilla&LastName=Descartes.
Обратите внимание, что предоставленные значения отображаются в виде пар имя/значение. (т. е. имя элемента управления = значение элемента управления), и каждая пара имя/значение отделяется друг от друга символом «&». Этот метод полезен, если вы планируете передать содержимое формы в отдельное исполняемое приложение или DLL, которое ожидает, что значения будут в стандартном формате. Однако, вообще говоря, доступ к содержимому коллекции осуществляется с помощью имени элемента управления в форме в качестве текстового ключа.
2) Обход коллекции ASP
Существует два способа обхода всех членов коллекции ASP. Методы в основном такие же, как и в обычных коллекциях VB. Каждая коллекция предоставляет свойство Count, которое возвращает количество элементов в коллекции. Его можно пройти с помощью свойства Count с использованием целочисленного индекса.
Для intLoop=1 для Request.Form.Count
Ответ.Запрос на запись.Форма(intLoop) & «<BR>»
ДалееЕсли
предыдущая форма содержит два текстовых поля со значениями Присциллы и Декарта, вы получите следующие результаты:
Присцилла
Декарт
Однако лучший подход — использовать структуру For Each...Next.
Для каждого объекта в Request.Form
Response.Write objItem & «=" & Request.Form(objItem) & «<BR>»
ДалееПреимущество
этого заключается в том, что вы можете получить доступ как к имени, так и к значению элемента управления. Приведенный выше код приведет к следующему:
FirstName = Priscilla.
LastName = Descartes
Обратите внимание, что значения <FORM>, возвращаемые некоторыми браузерами в ASP, могут не совпадать с порядком, отображаемым на странице.
3) Многозначность элементов коллекции
. В некоторых случаях каждый член коллекции ASP может иметь более одного значения. Это происходит, когда в определении HTML имеется несколько элементов управления, имеющих один и тот же атрибут Name. Например:
<FORM ACTION="Show_request.asp" METHOD="POST">
<INPUT TYPE="ТЕКСТ" NAME="Другое хобби">
<INPUT TYPE="ТЕКСТ" NAME="Другое хобби">
<INPUT TYPE="ТЕКСТ" NAME="Другое хобби">
<ТИП ВХОДА = «ОТПРАВИТЬ» ЗНАЧЕНИЕ = «Отправить»>
</FORM>
В коллекции Form будет создана запись для «OtherHobby». Однако он будет включать значения из трех текстовых полей. Если при отправке пользователь оставляет одно или несколько полей пустыми, возвращаемое значение представляет собой пустую строку. Если пользователь вводит «Садоводство» и «Альпинизм» в первом и третьем текстовых полях соответственно, а второе текстовое поле пусто, доступ к Request.Form("OtherHobby") в нашем коде ASP вернет строку:
Садоводство, ,Альпинизм
Чтобы иметь возможность в этом случае можно получить доступ к одному значению, вы можете использовать более сложный код:
для каждого объекта в Request.Form
If Request.Form(objItem).Count >1 Тогда «В этом элементе более одного значения. Response.Write objItem & «:<BR>»
Для intLoop = 1 To Request.Form(objItem).Count
Response.Write «Subkey» & intLoop & «value = «& Request.Form(objItem) (intLoop) & «<BR>»
Следующий
Еще
Response.Write objItem & «=» & Request.Form(objItem) & «<BR>»
Конец, если
ДалееДля
предыдущего экземпляра формы, содержащего три элемента управления OtherHobby, будет возвращено:
OtherHobby:
Значение подраздела 1 = Садоводство
Значение подраздела 2 =
Значение подраздела 3 = Альпинизм.
Однако, поскольку одно и то же имя нескольким текстовым полям присваивается редко, этот метод используется редко.
a) Элементы управления переключателем или кнопкой страницы в HTML
. В HTML ситуация, когда нескольким элементам управления необходимо присвоить один и тот же атрибут имени, — это кнопка переключателя (или опция), например:
<FORM ACTION="show_request.asp" METHOD=" POST »>
Я живу в:
<INPUT TYPE=”РАДИО” NAME=”Страна” VALUE=”AM”>Америка<BR>
<INPUT TYPE=”РАДИО” NAME=”Страна” VALUE=”EU”>Европа<BR>
<INPUT TYPE=”РАДИО” NAME=”Страна” VALUE=”AS”>Азия<BR>
<ТИП ВХОДА = «ОТПРАВИТЬ» ЗНАЧЕНИЕ = «Отправить»>
</FORM>
Поскольку пользователь может выбрать только один из нескольких элементов (поэтому им присваивается одно и то же имя), будет получено только одно возвращаемое значение, и браузер может отправить только значение выбранного элемента управления. Следовательно, если пользователь этой формы выбрал «Europez», эта запись будет получена, а ее значение будет получено путем обхода набора форм:
Страна = ЕС.
Поскольку для каждого элемента управления предусмотрен другой атрибут VALUE, он отражает значение соответствующее каждой записи. Название страны или региона. Если атрибут VALUE опущен, браузер вернет значение «on», поэтому вы получите:
Country = on
Это не часто используется, поэтому атрибут VALUE обычно используется для радиоэлементов с тем же именем.
б) Элемент управления флажком HTML.
Если исходный код HTML в форме содержит элемент управления флажком, ему обычно присваивается уникальное имя, например:
<FORM ACTION="show_request.asp" METHOD="POST">
Мне нравится:
<ТИП ВХОДА=”ЧЕКБОКС” НАЗВАНИЕ=”Чтение” ПРОВЕРЕНО> Чтение
<INPUT TYPE="CHECKBOX" NAME="Еда">Еда
<INPUT TYPE="CHECKBOX" NAME="Спящий режим"> Спящий режим
<ТИП ВХОДА = «ОТПРАВИТЬ» ЗНАЧЕНИЕ = «Отправить»>
</FORM>
В этом случае при отправке формы, если установлены (отмечены) только первый и третий флажки, при обходе коллекции Form будут получены следующие значения:
Reading = on
Sleeping = on
Однако, если вы укажете значение для каждого флажка, это значение будет отправлено на сервер вместо строки «on». Например, форма выглядит следующим образом:
<FORM ACTION="show_request.asp" METHOD="POST">
Мне нравится:
<INPUT TYPE=”CHECKBOX” VALUE=”Hobby025” NAME=”Hobby” ПРОВЕРЕН>_
Плавание
<INPUT TYPE=”CHECKBOX” VALUE=”Hobby003” NAME=”Hobby” ПРОВЕРЕН>_
Чтение
<INPUT TYPE="CHECKBOX" VALUE="Hobby068" NAME="Hobby">Еда
<INPUT TYPE="CHECKBOX" VALUE="Hobby010" NAME="Hobby">Спящий
<ТИП ВХОДА = «ОТПРАВИТЬ» ЗНАЧЕНИЕ = «Отправить»>
</FORM>
Если установлены все флажки, кроме третьего, коллекция Request.Form выдаст следующие результаты:
Hobby = Hobby025, Hobby003, Hobby010.
Если вы пишете более сложный код обхода коллекции, как упоминалось ранее (показан отдельно для каждого подраздела). , вы получите результат:
Хобби:
Значение подраздела 1 = Hobby025
Значение подраздела 2 = Hobby003
Значение подраздела 3 = Hobby010
Следует отметить, что в двух случаях невыбранный элемент управления вообще не возвращает никакого значения. В результате в первом случае нет обманчивых запятых, а во втором случае нет нулевых значений. Это отличается от результатов эквивалентного теста с использованием текстовых полей, описанных выше. При использовании текстовых полей каждое текстовое поле возвращает значение, даже пустую строку. Это вызвано браузером. Поэтому вам следует обратить внимание на эту проблему при доступе к коллекциям в коде ASP.
Сложный побочный эффект описанной выше ситуации заключается в том, что при использовании флажков индекс значения флажка не имеет отношения к положению элемента управления в исходном HTML. В приведенном выше примере четвертый флажок имеет номер подраздела 3. потому что при отправке формы второй элемент управления не выбирается.
в) Управление списком HTML.
Тег <SELECT> в HTML используется для создания стандартного раскрывающегося списка, значения которого представлены интересным гибридным способом. Следующая форма создана с 5 значениями, из которых пользователь может выбрать. Поскольку она содержит атрибут MULTIPLE, можно выбрать более одной записи, удерживая клавишу Shift или Ctrl во время выбора.
<FORM ACTION="show_request.asp" METHOD="POST">
<ВЫБЕРИТЕ ИМЯ="Хобби" РАЗМЕР="5" НЕСКОЛЬКО>
<ЗНАЧЕНИЕ ОПЦИИ=”Хобби001”>Программирование</ОПЦИЯ>
<ЗНАЧЕНИЕ ОПЦИИ=”Хобби025”>Плавание</ОПЦИЯ>
<ЗНАЧЕНИЕ ОПЦИИ=”Хобби003”>Чтение</ОПЦИЯ>
<OPTION VALUE=»Hobby068»>Еда</OPTION>
<ЗНАЧЕНИЕ ОПЦИИ=”Хобби010”>Сон</ОПЦИЯ>
</ВЫБРАТЬ><P>
<ТИП ВХОДА = «ОТПРАВИТЬ» ЗНАЧЕНИЕ = «Отправить»>
</FORM>
возвращает одну запись в коллекции Form, которая содержит выбранные значения (атрибут VALUE, указанный в одном теге <OPTION>), разделенные запятыми:
Hobby = Hobby025, Hobby003, Hobby010
, если Используя немного более сложный код обхода набора (показывающий каждый подраздел индивидуально), мы получаем:
Хобби:
Значение подраздела 1 = Hobby025
Значение подраздела 2 = Hobby003
Значение подраздела 3 = Hobby010
Это та же ситуация, что и выше для флажка с тем же именем. Фактически, список SELECT можно рассматривать как список флажков для выбора (не проверки) соответствующих элементов.
Однако поле списка также имеет указанное значение. Если вы установите атрибут VALUE в теге <OPTION>, вы получите текстовое содержимое выбранного параметра. Набор Request.Form будет содержать такой элемент:
Хобби = Плавание, Чтение, сон
и, аналогично, более сложный код итерации коллекции будет возвращать такие результаты:
Хобби:
Значение подраздела 1 = Плавание
Значение подраздела 2 = Чтение
Значение подраздела 3 = Sleeping
Конечно, если выбран один элемент и в <OPTION> указан атрибут VALUE, результат будет содержать только:
Hobby = Hobby025.
Если атрибут VALUE не указан, результат будет:
Hobby =
Hobby025.Плавание
позволяет отсутствовать. Провинциальный (то есть без ЗНАЧЕНИЯ) отображает текст параметра, а также может вносить соответствующие изменения. Последний случай чрезвычайно полезен в определенных ситуациях, например, когда вы хотите отобразить (описательную строку) и передать совершенно другое содержимое (например, используя короткий код для представления описательной строки).
d) Флажки и переключатели элементов управления представлением HTML и изображениями
являются примерами логических элементов управления, которые возвращают значение «включено», когда они отмечены или выбраны. В отличие от текстовых полей и большинства других элементов управления HTML, браузеры не включают неотмеченные или выбранные элементы управления. не выбран.
Существует еще один часто используемый логический элемент управления, называемый кнопкой HTML. Например, типы <INPUT TYPE="SUBMIT">, <INPUT TYPE="RESET">, <INPUT TYPE="IMAGE">, <INPUT TYPE="BUTTON"> и <BUTTON>...</BUTTON>.
Элементы управления типа BUTTON не возвращают никакого значения, поскольку не оказывают прямого влияния на форму. Даже если вы используете метод Submit, используемый для вызова формы, браузер не будет включать значение элемента управления типа BUTTON ни в один запрос. Аналогично, значение кнопки <INPUT TYPE="RESET"> никогда не отправляется на сервер.
Однако элементы управления кнопками ввода типа SUBMIT и IMAGE фактически отправляют форму на сервер, а их свойства VALUE содержат значения других элементов управления формы (при условии, что атрибут NAME включен в определение HTML). Например, эта форма может быть частью веб-приложения типа мастера, которое позволяет пользователю выполнить или отменить процесс:
<FORM ACTION="show_request.asp" METHOD="POST">
<INPUT TYPE="SUBMIT" NAME="btnSubmit" VALUE="Далее">
<INPUT TYPE="SUBMIT" NAME="btnSubmit" VALUE="Предыдущий">
<INPUT TYPE="SUBIMT" NAME="btnSubmit" VALUE="Отмена">
</FORM>
В форму можно включить несколько кнопок ОТПРАВИТЬ. В этом случае каждой кнопке должен быть присвоен уникальный атрибут VALUE, как показано выше. При отправке формы просмотр значений коллекции Request.Form приведет к получению значения, которое зависит от того, какая кнопка была нажата для отправки формы. Если пользователь нажмет кнопку «Предыдущий», он получит:
btnSubmit = Назад.
Таким образом, к коллекции Request.Form можно запросить определение следующей отображаемой страницы, например:
Select Case Request.Form("btnSubmit")
Дело «Далее»
Response.Redirect "page_3.asp"
Дело «Предыдущее»
Response.Redirect "page_1.asp"
Дело «Отмена»
Response.Redirect "main_menu.asp"
Конец выбора
В то же время вы также можете использовать разные атрибуты NAME для каждой кнопки по мере необходимости. И выберите имя элемента управления, значение которого содержится в коллекции Form. Чрезвычайно полезно в ситуациях, когда элемент управления не имеет полной разметки, а за ним следует более длинная текстовая метка, как показано на рисунке ниже.
Интерфейс на этом экране создается с помощью следующего кода:
<FORM ACTION="show_request.asp" METHOD="POST">
<B>Что ты хочешь делать сейчас?</B><P>
<INPUT TYPE=”SUBMIT” NAME=”btnNext” VALUE= ”>Перейти на следующую страницу<P>
<INPUT TYPE=”SUBMIT” NAME=”btnPrevious” Value=” ”> ВЕРНУТЬСЯ на предыдущую страницу<P>
<INPUT TYPE=”SUBMIT” NAME=”btnCancel” VALUE=” ”>Отменить и вернуться на страницу главного меню<P>
</FORM>
На странице ASP после получения данных вы можете проверить значение, указанное в названии кнопки, чтобы определить, какая кнопка была нажата.
Если Len(Request.Form("btnNext")) Тогда Response.Redirect "page_3.asp"
Если Len(Request.Form("btnPrevious")) Тогда Response.Redirect "page_1.asp"
If Len(Request.Form("btnCancel")) Тогда Response.Redirect "main_menu.asp"
Это задание заключается в запросе коллекции ASP по ключу и возврате пустой строки, если она не существует. Другими словами, если нажата вторая кнопка (предыдущая страница), значение Request.Form("btnNext") представляет собой пустую строку, а ее длина равна нулю без возникновения ошибки. При нажатии второй кнопки значение этой записи в коллекции Form Request.Form("btnPrevious") будет равно " ", а ее длина больше нуля.
e) Повышение эффективности использования коллекции запросов.
Доступ к коллекции ASP для загрузки значения — трудоемкий и трудоемкий процесс, поскольку эта операция включает в себя серию поисков связанных коллекций, что намного медленнее, чем доступ к локальной переменной. Поэтому, если вы планируете использовать значение из коллекции несколько раз на странице, вам следует рассмотреть возможность сохранения его как локальной переменной, например:
strTitle = Request.Form("Title")
strFirstName = Request.Form("Имя")
strLastName = Request.Form("Фамилия")
Если Len(stTitle) Тогда strTitle = strTitle & « «
Если strFirstName = " " Тогда
StrFullName = strTitle & " " & strLastName
ИначеЕсли Len(strFirstName) = 1 Тогда
StrFullName = strTitle & strFirstName & “· “ & strLastName
Еще
StrFullName = strTitle & strFirstName & " " & strLastName
End If
f) Поиск во всех коллекциях запросов
. В некоторых случаях можно узнать, что имя ключа значения появится в коллекции запросов, но не точно, какая это коллекция. Например, если несколько страниц (или разные разделы страницы) отправляют значение в один и тот же сценарий ASP, оно может появиться в коллекции Form или QueryString.
Чтобы понять, почему значение может появляться в разных коллекциях, рассмотрим следующую ситуацию: страница запрашивается с использованием элемента гиперссылки <A>. В этом случае единственный способ добавить значение к запросу — добавить его в URL-адрес. Однако то же значение может уже появиться в <FORM> на другой странице или в другой части той же страницы:
...
<FORM ACTION="process_page.asp" METHOD="POST">
<INPUT TYPE="ОТПРАВИТЬ" NAME="страница" VALUE="Далее">
<INPUT TYPE="SUBMIT" NAME="page" VALUE="Предыдущий">
<INPUT TYPE="SUBMIT" NAME="page" VALUE="Help">
</ФОРМА>
...
...
Для получения помощи перейдите на <A HREF="process_page.asp?page=Help">Страницу справки</A>.
...
В этом случае нажатие кнопки «Справка» в форме приведет к отправке пары имя/значение «page=Help» из коллекции Request.Form. Однако нажатие гиперссылки <A> может также отправить имя/значение «Page=Help», но на этот раз в коллекции QueryString. Чтобы получить доступ к этому значению, используйте специальную функцию объекта ASP Request:
strPage = Request("page")
Будет выполняться поиск по всей коллекции - QueryString, Form, Cookies, ClientCertificate, ServerVariables - по порядку, пока не будет найдено имя первого совпадающего значения. Это менее эффективно, чем прямой доступ к соответствующей коллекции, и небезопасно, если нет абсолютной гарантии, что значение не появится в другой коллекции.
Например, вам может потребоваться получить имя веб-сервера, который выполняет запрос клиента, выполнив поиск «SERVER_NAME» в коллекции Request.ServerVariables, которая появляется в каждом запросе. Однако если какая-либо другая коллекция также содержит значение с именем «server_name» (помните, что имена ключей не чувствительны к регистру), вы получите неправильные результаты при использовании Request («server_name»). Используя синтаксис Reqeust.ServerVariables("server_name"), нам будет сложно отслеживать ошибки.
Таким образом, используйте метод «поиск по всей коллекции» с особой осторожностью и только тогда, когда никакой другой метод не даст нужных вам результатов.
ж) Доступ к другим коллекциям.
В этом разделе этой статьи мы сосредоточились на коллекции Form, которая, вероятно, является наиболее используемой. Однако все эти приемы в равной степени применимы и к другим объектам. Включая те, которые предоставляются коллекциями объекта Request (т. е. Form, QueryString, Cookies, ServerVariables и ClientCertificate), а также файлы cookie (и коллекции, предоставляемые другими объектами), предоставляемые объектом Response.
Мы кратко рассмотрим, как значение вводится в коллекцию QueryString, а также его преимущества и недостатки. Однако оба набора файлов cookie имеют дополнительные функции, которые делают использование файлов cookie более удобным, как описано ниже.