#forms #asp-classic
Вопрос:
У меня есть следующая форма,
<form action="contact_us.asp" method="post" enctype="multipart/form-data" name="form1" id="form1">
<input name="firstname" type="text" id="firstname" size="30" />
<input name="lastname" type="text" id="lastname" size="30" />
<input type="submit" name="submit" id="submit" value="Submit" />
</form>
Но когда я пытаюсь получить значение этих переменных post в моем файле ASP contact_us.asp, он возвращает пустое значение. Код приведен ниже:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
</head>
<%
Dim FirstName, LastName, Email, Message
FirstName = request.form("firstname")
LastName = request.form("lastname")
response.write(FirstName amp; "OK")
%>
Он возвращает мне только «ХОРОШО». ничего в переменной сообщения?
Пожалуйста, помогите мне и скажите, что здесь не так?
Комментарии:
1. ?
<input name="message"/>
в приведенном выше HTML-коде нет (или,2. Когда я удаляю
enctype="multipart/form-data"
из HTML <из> тег, он работает нормально и возвращает значение.3. Если вам не нужно загружать файлы, вы можете удалить enctype=»составные/данные формы».
4. У вас есть кнопка «Отправить»? Или покажите, как вы заставляете метод POST?
5. да, у него есть HTML-кнопка «отправить». Я добавил его в код в вопросе. Пожалуйста, проверьте!
Ответ №1:
Классический ASP не обеспечивает встроенной поддержки для работы с «составными/форм-данными». Это удивительно простой недостаток даже для языка почтенного возраста ASP, но что вы собираетесь с этим делать, переходите к ASP.NET? (Да? о. ну, тогда не бери в голову.)
Если вы не загружаете файлы, проще всего просто придерживаться значения по умолчанию enctype
(которое есть application/x-www-form-urlencoded
). Единственное преимущество multipart/form-data
заключается в том, что вы можете помещать в него загруженные файлы. (Теоретически, это также имело бы то преимущество, что вы можете окончательно указать кодировку символов. Но ни один браузер на самом деле этого не делает.)
Если вам действительно нужно обрабатывать multipart/form-data
в классическом ASP, вам нужно будет самостоятельно проанализировать тело входящего запроса, разделив его на поля и значения. Или, скорее, более типично, используйте для этого существующую библиотеку*.
Эта библиотека обычно предоставляет отдельные интерфейсы для чтения загруженных файлов и других значений формы. Это полностью заменяет использование классического Request.Form
интерфейса ASP. Где именно вы можете его найти, зависит от выбранной вами библиотеки. Это означает, что если вы хотите иметь форму, которая может одинаково отвечать на любой enctype
из них, вам нужно проверить тип и использовать один из двух разных интерфейсов.
*: Есть грузы. например . Я не одобряю ни один из них как таковой… ни один из них на самом деле не анализирует составные части должным образом в соответствии со стандартом, и оба кажутся немного небрежными в отношении безопасности имени файла (никогда не храните файл под именем, предоставленным пользователем! катастрофа в области безопасности!). Но это, похоже, соответствует курсу для сценариев загрузки ASP. По крайней мере, в отличие от многих, они не просят за них денег.
Комментарии:
1. Он поддерживает это, но вы должны прочитать необработанные байтовые данные —
Request.BinaryRead()
.
Ответ №2:
Я нашел enctype
, полностью удалив (по умолчанию application/x-www-form-urlencoded
) тег формы, с которым Request.Form("SomeInputTagId")
все работало нормально method="post"
. Мне также не нужно было устанавливать какие-либо сторонние считыватели. Надеюсь, это поможет.
Ответ №3:
Не используйте enctype="multipart/form-data"
Удалите это из кода и посмотрите, работает ли это. Он form-data enctype
используется для загрузки данных, например файлов изображений. Вам нужно получить доступ к элементам формы немного по-другому, если вы используете это enctype
.
Если вы загружаете данные, то используемый вами объект ASP (например ASP Upload
) будет иметь функции для доступа к полям формы. Request.form("")
не сработает.
Доступ к значениям формы будет осуществляться в соответствии с:
Set yourUploadComponent = CreateObject("Your.UploadComponentClassString")
sFormValue = yourUploadComponent.Form.Item("txtName").Value
Вам нужно будет прочитать документацию по объектам.