Так называемая сложная форма здесь относится к форме, которая содержит несколько различных типов ввода, таких как раскрывающиеся списки, однострочный текст, многострочный текст, числовые значения и т. д. В ситуациях, когда такие формы часто требуют замены, требуется программа динамической генерации формы. В этой статье представлена именно такая система, которая использует базу данных для сохранения данных определения формы и использует сценарии ASP для динамического создания HTML-кодов форм и сценариев для проверки входных данных формы.
1. Определите структуру таблицы базы данных.
В Интернете часто можно встретить такие формы, как «Еженедельный опрос». Эту форму необходимо часто обновлять. Если есть программа, которая динамически генерирует формы и сценарии их проверки, рабочая нагрузка по созданию этих форм может быть значительно уменьшена.
В примере создания и проверки динамической формы в этой статье мы используем базу данных Access для хранения определяющей информации о форме. В то же время для простоты данные, введенные пользователем в форму, также сохраняются в той же базе данных. . Для определения формы требуются две таблицы: первая таблица (Определения) используется для определения полей ввода формы, а вторая таблица (Списки) сохраняет дополнительную информацию о каждом поле ввода, например элементы выбора в списке выбора.
Таблица Definitons содержит следующие поля:
FieldName - имя переменной, присвоенное полю ввода формы.
Метка - текстовая метка, информативный текст, отображаемый перед полем ввода.
Тип – одиночный символ, который представляет собой форму поля ввода формы и тип входного значения, а именно:
(t) Поле ввода текста, то есть < INPUT TYPE="TEXT" >.
(n) Поле ввода текста, но требует числового значения.
(m) Содержимое заметки, используемое для ввода комментариев или других больших объемов текста, представляет собой многострочное поле редактирования текста.
(б) Требуется ввод «да» или «нет». В этой реализации для получения этих входных данных будет использоваться флажок с текстовой меткой флажка «Да». Если пользователь выбирает его, возвращаемое значение — «включено».
(r) Радиокнопка.
(l) Раскрывающийся список.
Мин. — допустимо только для числовых входных значений, здесь указывается минимальное значение. В этом примере имеется поле числового ввода «Возраст», минимальное значение которого установлено на 1.
Макс. Значение этого поля относительно формы поля ввода. Для полей числового ввода оно представляет максимально допустимое значение. Например, максимальное значение «Возраст» равно 100. Для полей ввода текста значение «Макс» представляет максимально допустимое количество символов. Для многострочных текстовых полей редактирования Макс представляет количество текстовых строк в видимой области.
Обязательно — указывает, требуется ли ввод. Если значение этого типа не введено, валидатор ввода сообщит об ошибке. В форме значения, которые необходимо ввести, отмечены звездочкой, а пользователю в виде сноски предлагается ввести такие значения.
Пример формы в этой статье представляет собой анкету программиста ASP. Определение формы в таблице «Определения» следующее:
Имяполя Тип метки Мин. Макс. Требуемое
имя Текст имени (t) — 50 Нет
Возраст Возрастной номер (n) 1 100 Нет
Пол. Одиночный пол Кнопка выбора (r) - - Да
Текст адреса электронной почты (t) - - Да
Раскрывающийся список языков программирования (l) - - Нет
Списки используются для сохранения некоторой дополнительной информации, определенной в поле ввода. В этом примере «Пол используется для двух входных значений» и «Языки». Таблица Lists очень проста и содержит только следующие три поля:
Имя поля – поле ввода, которому принадлежит текущая запись.
Значение – значение выбора.
Метка – текст подсказки выбора, который видит пользователь.
Поле ввода «Пол». можно ввести только из двух значений на выбор: «Мужской» или «Женский». В разделе «Язык» перечислены несколько языков программирования, которые можно применять в среде ASP, в том числе: VBScript, JavaScript, C, Perl и «Другие».
Третья таблица «Записи» сохраняет содержимое, отправленное пользователем. Она также содержит три поля. Каждая запись соответствует представлению пользователя:
Запись — тип примечания, ввод пользователя сохраняется в виде строки запроса.
Создано — дата и время отправки формы пользователем. RemoteIP — IP-адрес отправителя формы.
В реальных приложениях может потребоваться сбор дополнительной информации о пользователях. Для простоты в этом примере записываются только две дополнительные информации: время отправки и IP-адрес пользователя.
2. Подготовка
После завершения определения вышеуказанной структуры и формы данных вы можете написать сценарий. Задача сценария — генерировать формы и обрабатывать формы, отправленные пользователем.
Независимо от того, генерируется или обрабатывается форма, необходимы следующие три процесса (задачи): Во-первых, определение типа проверки. При создании формы значение типа проверки получается через строку запроса и при обработке формы. , получаются скрытые поля из формы. Программа поддерживает четыре типа методов проверки формы: без проверки, проверка JavaScript на стороне клиента, проверка сценария ASP на стороне сервера, а также проверка как на стороне клиента, так и на стороне сервера (кодовые имена от 0 до 3 соответственно). Если в строке запроса не указан действительный метод аутентификации, по умолчанию используется четвертый метод аутентификации. Этот метод обработки проверки позволяет нам гибко применять эту систему генерации и обработки форм. Когда клиент запрещает использование проверки JavaScript, процесс проверки может выполняться только на стороне сервера. Вот код для определения типа проверки:
Проверьте тип проверки.
Вот фрагмент цитаты:
iValType = Request.QueryString("val")
Если IsNumeric(iValType) = False, то iValType = 3
Если iValType > 3 или iValType < 0, то iValType =3
Вторая задача — открыть соединение с базой данных и создать два объекта набора записей: объект RS, который является основным объектом набора записей в этой программе, используемым для работы с таблицей определений; объект RSList, в основном используемый для чтения данных из таблицы списков. Пример программы предоставляет два метода подключения к базе данных: с использованием ODBC DSN или без использования ODBC DSN (при использовании DSN необходимо сначала создать DSN с именем Dynamic, а код использования DSN для подключения к базе данных закомментирован).
Третья задача — вывести некоторый статический HTML-код до (и после) генерации (или обработки) сценария формы, например <HEAD>< /HEAD>, и освободить RS, RSList и другие объекты, занятые при завершении ресурса сценария. .
Помимо кода, выполняющего вышеуказанные задачи, существует два типа страниц, которые могут быть созданы остальными сценариями ASP в примере приложения: форма вопроса (см. рисунок выше) и страница результатов, которая появляется после того, как форма будет заполнена. отправлено (последний также несет ответственность за запись результатов, представленных пользователем). Самый простой способ определить, какую часть сценария следует запустить, — проверить, была ли отправлена форма: если да, обработать форму, в противном случае сгенерировать форму;
Это создание формы или обработка формы.
Ниже приведен фрагмент цитаты:
Если Лен(Запрос.Форма) = 0 Тогда
'Сгенерировать форму... слегка...
Еще
'Обработайте форму... слегка...
End If
3. Динамическое создание формы
. При создании формы программа определяет записи в соответствии с каждым полем ввода в таблице «Определения» и поочередно генерирует соответствующий HTML-код формы и код JavaScript. Первое, что нужно сгенерировать в HTML-коде, — это текстовый тег:
Вот фрагмент цитаты:
sHTML = sHTML & vbTab & "<TR >" & vbCrLf & vbTab & vbTab
sHTML = sHTML & "< TD VALIGN=" & Chr(34) & "TOP" & Chr(34)
sHTML = sHTML & " >" & vbCrLf & vbTab & vbTab & vbTab
sHTML = sHTML & «< B >» & RS.Fields («Метка»)
Затем программа проверяет, требует ли ввода текущее поле ввода. При необходимости добавьте звездочку после текста метки (обозначающую, что значение необходимо ввести), а для значения, которое необходимо ввести, должен быть сгенерирован соответствующий код JavaScript для его проверки. Для переключателей или списков выбора существует дополнительная проверка того, что пользователь действительно выбрал опцию, для всех других типов ввода просто проверьте, что входное значение не пусто;
После текстовой метки располагаются элементы ввода формы, а HTML-код для этих элементов генерируется на основе типов и атрибутов, указанных в таблице «Определения». Следующим шагом является создание кода JavaScript, который выполняет задачи проверки на стороне клиента на основе требований к входным значениям. В этом примере только числовые значения требуют дальнейшей проверки, чтобы убедиться, что ввод пользователя действительно является числом и что числовое значение находится между разрешенными максимальным и минимальным значениями. После создания приведенного выше кода вы можете завершить строку таблицы (то есть поле ввода) и продолжить обработку следующей записи таблицы определений. После обработки всех записей базы данных следующим шагом будет добавление HTML-кода для кнопок «Отправить» и «Очистить». Если посмотреть на это под другим углом, то задача программы здесь — сформировать каждое поле ввода на основе записи базы данных. Каждое поле ввода занимает строку таблицы, а каждая строка таблицы имеет две ячейки: первая ячейка используется для отображения. текстовые метки, а второй — модуль отображает сам элемент ввода (код см. в dForm.asp).
После завершения описанного выше процесса HTML-код формы и функция JavaScript проверки сохраняются в переменных sHTML и sJavaScript соответственно. Перед записью этого содержимого на страницу программа проверяет, требует ли клиент проверки JavaScript. Если такая проверка не требуется, переменная sJavaScript очищается:
Если iValType = 0 Или iValType = 2 Тогда sJavaScript = ""
После вывода тега BODY. программа выводит следующую функцию JavaScript:
Ниже приведен фрагмент цитаты:
< SCRIPT LANGUAGE="JavaScript" >
< !--
функция проверки (TheForm) {
//Проверка формы клиента
< %=sJavaScript% >
вернуть истину;
}
функция CheckRadio(objRadio){
//Выбрано ли значение в переключателе
for(var n = 0; n <objRadio.length; n++){
если (objRadio[n].checked){
вернуть истину;
}
}
вернуть ложь;
}
функция CheckList(objList){
//Выбрано ли значение в списке выбора
for(var n = 1; n <objList.length; n++){
если (objList.options[n].selected){
вернуть истину;
}
}
вернуть ложь;
}
//-- >
</ /Скрипт >
Если клиенту не требуется проверка JavaScript, функция проверки остается с оператором return true. Последние две статические функции JavaScript (CheckRadio и CheckList) в приведенном выше коде используются для проверки переключателей и раскрывающихся списков. Функция проверки будет вызывать их, когда необходимо проверить эти два поля ввода.
Теперь вы можете начать писать форму на странице:
< FORM ACTION="./dform.asp" METHOD="POST" NAME="MyForm" onSubmit="return validate(this)" >
Здесь, только если функция проверки возвращает значение true Только после этого выполните операцию отправки формы. Поэтому, когда функция проверки JavaScript на стороне клиента отключена, функция проверки автоматически возвращает true.
Следующее, что нужно добавить, — это скрытое поле под названием val. Как упоминалось ранее, это значение указывает режим проверки формы.
< INPUT TYPE="HIDDEN" NAME="val" VALUE="< %=iValType% >" >
Когда пользователь отправляет форму, сценарий обработки будет использовать это значение, чтобы определить, следует ли выполнять проверку на стороне сервера.
Затем на выходе получаются метка таблицы и заголовок таблицы. Заголовок сохраняется в переменной sTitleLabel, значение которой инициализируется при запуске скрипта:
Вот фрагмент цитаты:
< ГРАНИЦА ТАБЛИЦЫ="0" >
<ТР>
<TD COLSPAN="2" ALIGN="ЦЕНТР" >
< H2 >< %=sTitleLable% >< /H2 >
</ТД>
</ТР>
В качестве меры по улучшению можно добавить поле FormID в таблицы «Определения», «Списки» и «Записи». FormID уникально идентифицирует форму, поэтому программа может одновременно определять несколько форм и сохранять результаты ответов пользователя в нескольких формах. Что касается sTitleLabel выше, мы можем использовать другую таблицу (например, Forms) для ее сохранения.
После отметки таблицы и названия таблицы программа выводит HTML-форму и код кнопок «Отправить» и «Очистить». После этого программа проверяет, содержит ли строка sHTML «*». Если это так, это означает, что в форме есть контент, который необходимо ввести. В это время выводится сноска, поясняющая значение звездочки.
Вот цитата:
< %=sHTML% >
<ТР>
<TD COLSPAN="2" ALIGN="ЦЕНТР" >
< INPUT TYPE="SUBMIT" VALUE="Отправить форму" > < INPUT TYPE="сбросить" VALUE="Очистить" >
</ТД>
<%
'Есть ли поле формы, требующее ввода, если да, выведите сноску формы, чтобы объяснить значение '*'
Если InStr(sHTML,"*") Тогда
%>
</ТР>
<TD COLSPAN="2" ALIGN="ЦЕНТР" >
< FONT SIZE="2" >Примечание. Значения, отмеченные звездочкой, обязательны. </FONT>
</ТД>
</ТР>
<%
Конец, если
%>
</ТАБЛИЦА>
</ /ФОРМА >
На данный момент задача создания формы выполнена.
4. Обработка результатов отправки.
Остальными задачами сценария ASP являются обработка формы на стороне сервера, включая проверку, сохранение результатов в базе данных и отображение страницы «Успешная/неудача отправки». В этой части кода проверки формы используется строковая переменная sBadForm, и программа использует ее для сохранения информации об ошибках. Если sBadForm пуст в конце процесса проверки, это означает, что форма, отправленная пользователем, является законной. В противном случае отправка формы отклоняется и sBadForm возвращается в браузер;
Независимо от того, какой режим проверки используется в вашей форме, рекомендуется проверить наличие HTTP_REFERER. Эта проверка предотвращает кражу скрипта. Чтобы проверить, исходит ли определенный POST со страницы или скрипта с этого сайта, просто сравните две переменные сервера:
Вот фрагмент цитаты:
Если InStr(Request.ServerVariables("HTTP_REFERER"), _
Request.ServerVariables("HTTP_HOST")) = 0 Тогда
sBadForm = "<LI>Форма была отправлена из неверного места."
Конец, если
Если скрытое поле формы указывает на необходимость выполнения проверки на стороне сервера, программа просматривает записи базы данных определений формы и выполняет соответствующие проверки. Этот процесс очень похож на создание формы, за исключением того, что на этот раз программа проверяет. form и добавляет недопустимую информацию о входных значениях в Just go to sBadForm. См. dForm.asp для конкретного кода.
Программа наконец проверяет, пуст ли sBadForm. Если не пусто, отправка формы отклоняется и sBadForm записывается в браузер. Если sBadForm пуст, добавьте запись в таблицу Records, чтобы сохранить данные формы. Скрытое поле val необходимо удалить перед сохранением содержимого формы. Это скрытое поле всегда является первым полем ввода формы:
Ниже приведен фрагмент цитаты:
Если Len(sBadForm) = 0 Тогда
RS.Откройте «Записи», DB, 3, 2, &H0002
RS.ДобавитьНовый
RS.Поля("Запись") = Mid(Запрос.Форма, InStr(Запрос.Форма, "&") + 1)
RS.Fields("Создано") = Сейчас()
RS.Fields("RemoteIP") = Request.ServerVariables("REMOTE_ADDR")
RS.Обновление
Response.Write("< H1 >Спасибо.< /H1 >")
RS.Закрыть
Еще
Response.Write("< H1 >Ошибка отправки формы. </H1 >")
Response.Write(vbCrLf & sBadForm)
Конец, если
Конец, если
Вот и все, что касается обработки форм на стороне сервера. В зависимости от того, существует ли отправленная форма, мы можем инкапсулировать здесь предыдущий код генерации формы и код обработки формы с помощью оператора If, чтобы две части сценария имели общий код, например заголовок HTML-документа. создание объектов базы данных и освобождение ресурсов ждут.
В целом, dForm.asp имеет только основные функции, необходимые для динамического создания и проверки форм, и игнорирует обработку многих детальных проблем. Например, упомянутая ранее проблема с несколькими формами: добавление таблицы для управления несколькими формами позволяет сценарию иметь возможность управлять, генерировать и обрабатывать указанные формы. Еще одним явным недостатком является возможность добавлять, удалять и обновлять данные, определенные в форме, а также доступ к данным результатов, отправленных пользователем. Такая функциональность может быть реализована в отдельной программе и в большинстве случаев может быть преобразована в программу. традиционное приложение (приложения без структуры B/S). Наконец, типы полей ввода, поддерживаемые dForm.asp, также ограничены. На практике могут существовать и другие требования к вводу формы, например выделенное поле ввода адреса электронной почты. Однако для веб-сайтов, которые часто обновляют формы, функции динамической генерации форм и динамической проверки, обсуждаемые в этой статье, действительно очень полезны.