【问题标题】:AJAX - Classic ASP - Post a FormAJAX - 经典 ASP - 发布表单
【发布时间】:2016-07-29 03:36:22
【问题描述】:

我有一个带有此代码的 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");",一切正常。

我已经读过要发送整个表单(就像“通常”的帖子一样),我只需要制作“var formData = new FormData(params);”其中 params 将是表单对象,然后发送 FormData(params)。

我在这里做错了什么?

【问题讨论】:

  • var formData = new FormData(params);尝试> console.log(formData);检查要发布的值
  • 可能会发现这篇文章很有用 - Easier Ajax With the HTML5 FormData Interface - 使用 FormData 使用 application/x-www-form-urlencoded 正确传递数据的“香草”方法。
  • @Lankymart 你不想写这个作为答案吗?这样我就可以给你功劳了!
  • 如果我今天有时间会做。

标签: javascript ajax forms post asp-classic


【解决方案1】:

我不想在没有答案的情况下留下这个。

Lankymart 给出了正确答案的路径......事实是,当我提交“新 FormData(formID)”时,我发送的是 multipart/form-data 而不是 application/x-www-form-urlencoded我在声明。

所以... 我们可以做出 Lankymart 指出的假设 (application/x-www-form-urlencoded)。 换句话说,您只需接受我最初的问题,并在 req.send();您必须形成要传递的参数字符串(就像在 GET 请求中一样)。 "name1="+param1+"&name2="+param2. 我选择了这个,因为对于我所需要的,这已经足够了。

或者... 如果我们确实需要/希望发送表单 - 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)

在这个例子中,我构建了一个非常基本的解析器......它没有为文件上传之类的事情做好准备,但这只是一个例子。

希望我没有犯任何大错……它会对某人有所帮助。

【讨论】:

  • 我想在这里表扬一下——您的回答帮助我解决了我遇到的问题。虽然我无法让您的代码正常工作,但它有助于解决问题。谢谢! stackoverflow.com/questions/65158652/…
【解决方案2】:

在到处搜索并尝试了各种方法之后,这篇文章终于让我走上了正轨。我的经典 asp 页面根本无法读取我发送给它的 ajax 表单帖子。

最终使它起作用的是 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
%>

【讨论】:

    猜你喜欢
    • 2015-05-06
    • 2011-03-24
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    相关资源
    最近更新 更多