AJAX - 经典 ASP - Post 表格
AJAX - Classic ASP - Post a Form
我有一个 TEST.ASP,代码如下:
<HTML>
<HEAD>
<SCRIPT src="ajaxScript.js" type="text/javascript"></SCRIPT>
</HEAD>
<BODY>
<FORM action="action_page.asp" method="post">
First Name:<BR>
<INPUT type="text" name="FName"><BR>
Last Name:<BR>
<INPUT type="text" name="LName"><BR>
<INPUT type="submit" value="Submit">
<BUTTON type="button" onClick="loadXMLDoc('action_page.asp',this.form);">GoGoGo!</BUTTON>
</FORM>
<DIV id="msgBoxDiv">TEST!!</DIV>
</BODY>
</HTML>
调用的 Javascript 文件 (ajaxScript.js) 具有以下代码:
var req; // global variable to hold request object
function processReqChange()
{
if (req.readyState == 4 && req.status == 200){document.getElementById("msgBoxDiv").innerHTML = req.responseText;}
}
function loadXMLDoc(url, params)
{
if(window.XMLHttpRequest)
{
try
{
req = new XMLHttpRequest();
} catch(e)
{
req = false;
}
}
else
{
req = false;
}
if(req)
{
var formData = new FormData(params);
req.onreadystatechange = processReqChange;
req.open("POST", url, true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
req.send(formData);
return true;
}
return false;
}
而我的"action_page.asp"接收参数是这样的:
<%
vRF1 = request.Form("FName")
vRF2 = request.Form("LName")
%>
<HTML>
<HEAD>
</HEAD>
<BODY>
First:<%=vRF1%><BR>
Last:<%=vRF2%>
</BODY>
</HTML>
如果我进行正常提交(提交按钮),一切都会按预期进行:它会显示一个包含表单值的新页面。
但是...如果我尝试使用 AJAX(gogogo 按钮)读取目标 ASP,我无法将表单发送到目标页面。我确实收到了目标页面,但没有预期的值。
我明白了:
Result page
如果我将 "req.send(formData);" 更改为“req.send("FName="+1+"&LName=QWER");”,一切正常。
我读过要发送整个表单(就像 "usual" post 那样),我只需要 "var formData = new FormData(params);" ,其中 params 是表单对象,并且然后发送 FormData(params).
我可能做错了什么?
我不想在没有答案的情况下留下这个问题。
Lankymart 给出了正确答案的路径...事实是,当我提交 "new FormData(formID)" 时,我发送的是 multipart/form-data 而不是我声明的 application/x-www-form-urlencoded。
所以...
我们可以做出 Lankymart 指示的假设 (application/x-www-form-urlencoded)。
换句话说,你只需接受我最初的问题,然后在 req.send();您必须形成要传递的参数字符串(就像在 GET 请求中一样)。 "name1="+param1+"&name2="+param2.
我选择了这个,因为对于我所需要的,这已经足够了。
或者...
如果我们 need/wish 发送表单 - req.send(formData)... 将生成一个 multipart/form-data(请在此处检查 multipart/form-data 的格式示例:http://www.codeproject.com/Articles/1125/Advanced-ASP-Uploader)
在这种情况下......你必须为信息构建一个解析器。
这是我编写的代码(只是为了尝试一两件事):
Function StoreNameAndValues(tempVarArray)
Dim tempVar
for i = 1 to ubound(tempVarArray)-1
if tempVarArray(i)<>"" then
tempVar=Split(tempVarArray(i), """")
if ubound(tempVar)>1 then
postNamesArray(i-1)=tempVar(1)
postValuesArray(i-1)=StripString(tempVar(2),CHR(13)&CHR(10))
End if
End if
next
End Function
tempVar=Request.TotalBytes
tempVar1=Request.BinaryRead(tempVar)
tempVar1=SimpleBinaryToString(tempVar1)
separator=Split(tempVar1, CHR(13)&CHR(10))(0)
tempVar2=Split(tempVar1,separator)
postArgumentsSize=ubound(tempVar2)-1
Dim postNamesArray()
Dim postValuesArray()
ReDim Preserve postNamesArray(postArgumentsSize)
ReDim Preserve postValuesArray(postArgumentsSize)
StoreNameAndValues(tempVar2)
在这个例子中,我构建了一个非常基本的解析器...它没有为文件上传等事情做好准备,但这只是一个示例。
希望我没有犯任何大错误...它会对某人有所帮助。
在到处搜索并尝试各种方法后,这个 post 终于让我走上了正轨。我的经典 asp 页面根本无法读取我发送给它的 ajax 表单 post。
最终使它起作用的是 ajax 函数中的 contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
。所以这就是我最终发送表单的方式,经典的 asp 页面读取所有值,就像它应该的那样。
$('#subdel').click(function () {
// get values outside of the form
var tDate = $('#datepicker').val();
var tCID = $('#Client').val();
var vFD = $('#dataentry').serialize();
// add those values to the form
vFD = vFD + '&C=' + tCID;
vFD = vFD + '&D=' + tDate;
$(function() {
var request = $.ajax({
url: 'api/saveDLR.asp',
type: 'POST',
data: vFD,
processData: false,
contentType: false,
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
cache: false,
success: function (response) {
// hide some parts of the page, and then show the result from saving the form
$('#cldel').hide("slow");
$('#endel').hide("slow");
$("#encon").html( response );
$('#encon').show("slow");
// refresh a table after the form was processed
$(function() {
var request = $.ajax({
url: "/api/getDelClient.asp?C=" + tCID + "&D=" + tDate,
type: "GET",
dataType: "html",
success: function (response) {
$("#cldel").html( response );
$('#cldel').show("slow");
},
error: function (response) {
alert(response.responseText);
}
});
});
},
error: function (response) {
alert(response.responseText);
}
});
});
});
也许它(仍然)可以帮助其他人。
asp页面只是用Request.Form
读取表单数据
<% For Each item In Request.Form
Response.Write item & " - " & Request.Form(item) & "<br/>"
Next
%>
我有一个 TEST.ASP,代码如下:
<HTML>
<HEAD>
<SCRIPT src="ajaxScript.js" type="text/javascript"></SCRIPT>
</HEAD>
<BODY>
<FORM action="action_page.asp" method="post">
First Name:<BR>
<INPUT type="text" name="FName"><BR>
Last Name:<BR>
<INPUT type="text" name="LName"><BR>
<INPUT type="submit" value="Submit">
<BUTTON type="button" onClick="loadXMLDoc('action_page.asp',this.form);">GoGoGo!</BUTTON>
</FORM>
<DIV id="msgBoxDiv">TEST!!</DIV>
</BODY>
</HTML>
调用的 Javascript 文件 (ajaxScript.js) 具有以下代码:
var req; // global variable to hold request object
function processReqChange()
{
if (req.readyState == 4 && req.status == 200){document.getElementById("msgBoxDiv").innerHTML = req.responseText;}
}
function loadXMLDoc(url, params)
{
if(window.XMLHttpRequest)
{
try
{
req = new XMLHttpRequest();
} catch(e)
{
req = false;
}
}
else
{
req = false;
}
if(req)
{
var formData = new FormData(params);
req.onreadystatechange = processReqChange;
req.open("POST", url, true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
req.send(formData);
return true;
}
return false;
}
而我的"action_page.asp"接收参数是这样的:
<%
vRF1 = request.Form("FName")
vRF2 = request.Form("LName")
%>
<HTML>
<HEAD>
</HEAD>
<BODY>
First:<%=vRF1%><BR>
Last:<%=vRF2%>
</BODY>
</HTML>
如果我进行正常提交(提交按钮),一切都会按预期进行:它会显示一个包含表单值的新页面。
但是...如果我尝试使用 AJAX(gogogo 按钮)读取目标 ASP,我无法将表单发送到目标页面。我确实收到了目标页面,但没有预期的值。
我明白了:
Result page
如果我将 "req.send(formData);" 更改为“req.send("FName="+1+"&LName=QWER");”,一切正常。
我读过要发送整个表单(就像 "usual" post 那样),我只需要 "var formData = new FormData(params);" ,其中 params 是表单对象,并且然后发送 FormData(params).
我可能做错了什么?
我不想在没有答案的情况下留下这个问题。
Lankymart 给出了正确答案的路径...事实是,当我提交 "new FormData(formID)" 时,我发送的是 multipart/form-data 而不是我声明的 application/x-www-form-urlencoded。
所以... 我们可以做出 Lankymart 指示的假设 (application/x-www-form-urlencoded)。 换句话说,你只需接受我最初的问题,然后在 req.send();您必须形成要传递的参数字符串(就像在 GET 请求中一样)。 "name1="+param1+"&name2="+param2. 我选择了这个,因为对于我所需要的,这已经足够了。
或者... 如果我们 need/wish 发送表单 - req.send(formData)... 将生成一个 multipart/form-data(请在此处检查 multipart/form-data 的格式示例:http://www.codeproject.com/Articles/1125/Advanced-ASP-Uploader) 在这种情况下......你必须为信息构建一个解析器。 这是我编写的代码(只是为了尝试一两件事):
Function StoreNameAndValues(tempVarArray)
Dim tempVar
for i = 1 to ubound(tempVarArray)-1
if tempVarArray(i)<>"" then
tempVar=Split(tempVarArray(i), """")
if ubound(tempVar)>1 then
postNamesArray(i-1)=tempVar(1)
postValuesArray(i-1)=StripString(tempVar(2),CHR(13)&CHR(10))
End if
End if
next
End Function
tempVar=Request.TotalBytes
tempVar1=Request.BinaryRead(tempVar)
tempVar1=SimpleBinaryToString(tempVar1)
separator=Split(tempVar1, CHR(13)&CHR(10))(0)
tempVar2=Split(tempVar1,separator)
postArgumentsSize=ubound(tempVar2)-1
Dim postNamesArray()
Dim postValuesArray()
ReDim Preserve postNamesArray(postArgumentsSize)
ReDim Preserve postValuesArray(postArgumentsSize)
StoreNameAndValues(tempVar2)
在这个例子中,我构建了一个非常基本的解析器...它没有为文件上传等事情做好准备,但这只是一个示例。
希望我没有犯任何大错误...它会对某人有所帮助。
在到处搜索并尝试各种方法后,这个 post 终于让我走上了正轨。我的经典 asp 页面根本无法读取我发送给它的 ajax 表单 post。
最终使它起作用的是 ajax 函数中的 contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
。所以这就是我最终发送表单的方式,经典的 asp 页面读取所有值,就像它应该的那样。
$('#subdel').click(function () {
// get values outside of the form
var tDate = $('#datepicker').val();
var tCID = $('#Client').val();
var vFD = $('#dataentry').serialize();
// add those values to the form
vFD = vFD + '&C=' + tCID;
vFD = vFD + '&D=' + tDate;
$(function() {
var request = $.ajax({
url: 'api/saveDLR.asp',
type: 'POST',
data: vFD,
processData: false,
contentType: false,
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
cache: false,
success: function (response) {
// hide some parts of the page, and then show the result from saving the form
$('#cldel').hide("slow");
$('#endel').hide("slow");
$("#encon").html( response );
$('#encon').show("slow");
// refresh a table after the form was processed
$(function() {
var request = $.ajax({
url: "/api/getDelClient.asp?C=" + tCID + "&D=" + tDate,
type: "GET",
dataType: "html",
success: function (response) {
$("#cldel").html( response );
$('#cldel').show("slow");
},
error: function (response) {
alert(response.responseText);
}
});
});
},
error: function (response) {
alert(response.responseText);
}
});
});
});
也许它(仍然)可以帮助其他人。
asp页面只是用Request.Form
读取表单数据<% For Each item In Request.Form
Response.Write item & " - " & Request.Form(item) & "<br/>"
Next
%>