将onsubmit与javascript一起使用时,Classic ASP Request.form不会得到更新

将onsubmit与javascript一起使用时,Classic ASP Request.form不会得到更新,javascript,forms,asp-classic,vbscript,Javascript,Forms,Asp Classic,Vbscript,我有一个简单的表单,使用Javascript在数据库上执行搜索 <form id="searchForm" onsubmit="return searchTree(this);" method="post" class="form-poshytip"> <input type="text" name="searchbox" placeholder="zoek hier je product..." id="searchField" /> <input type=

我有一个简单的表单,使用Javascript在数据库上执行搜索

<form id="searchForm" onsubmit="return searchTree(this);" method="post" class="form-poshytip">
 <input type="text" name="searchbox" placeholder="zoek hier je product..." id="searchField" />
 <input type="image" value="Zoeken" name="submit" src="../img/Zoeken.PNG" alt="submit" />
</form>

在Javascript中,我使用经典ASP连接Access

<script language="JavaScript">
function searchTree(form) {
<% Dim rsTreeview2 %>
<% Set adoCon = Server.CreateObject("ADODB.Connection") %>
<% adoCon.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("...") %>
<% Set rsTreeview2 = Server.CreateObject("ADODB.Recordset") %>
<% strSQL = "SELECT tblTreeview_nl.volgnr, tblTreeview_nl.lid_van, tblTreeview_nl.omschrijving, tblTreeview_nl.doctype, tblTreeview_nl.docnaam FROM tblTreeview_nl WHERE tblTreeview_nl.omschrijving LIKE '%" & request.form("searchbox") & "%'"%>
<% rsTreeview2.Open strSQL, adoCon %>
...
<% rsTreeview2.Close %>
<% Set rsTreeview2 = Nothing %>
<% Set adoCon = Nothing %>
return false;
};
</script> 

函数搜索树(表单){
...
返回false;
};

第一次单击按钮时,我使用request.form(“searchbox”)从文本框中获取正确的值,但如果在更改文本框后再次单击按钮,request.form(“searchbox”)将包含旧值。如何从文本框中获取当前值?

Phew,从何处开始

  • 第一,;请从此帖子中删除您的数据库名称,因为我可以找到 下载它
  • 第二;转义搜索词,以防止SQL注入
问题是您使用了
onsubmit=“return searchTree(this);”
。这意味着如果函数返回FALSE,则不提交表单。 在您的脚本中,我看到函数总是返回false,因此表单不会真正提交

我不确定为什么要将所有ASP/vbscript代码都放在javascript标记中,但我假设您将一些javascript代码直接输出到脚本标记中以创建树视图。这很好,但出于测试的目的,我将首先在屏幕上输出它,而不是在脚本标记中,然后从中开始工作

我已经重新格式化了您的代码,以实现这一点。对于您遇到的SQL注入问题,这里还有一个快速修复方法

希望这有帮助

埃里克

20那么
recordsetToString=recordsetToString&typename(objField.Value)
其他的
recordsetToString=recordsetToString&objField.Value
如果结束
如果结束
recordsetToString=recordsetToString&“”&vbNewLine
下一个
recordsetToString=recordsetToString&“”&vbNewLine
下一个
环
如果rs.CursorType>0,则
先走一步
如果结束
如果结束
recordsetToString=recordsetToString&“”&vbNewLine
端函数
如果hasValue(request.form(“searchbox”)),那么
暗阿多孔
设置adoCon=Server.CreateObject(“ADODB.Connection”)
adoCon.Open“Provider=Microsoft.Jet.OLEDB.4.0;数据源=“&Server.MapPath(“[PATH\u TO\u DATBASE]”)
暗rsTreeview2
Set rsTreeview2=Server.CreateObject(“ADODB.Recordset”)
strSQL=“从tblTreeview中选择tblTreeview\u nl.volgnr、tblTreeview\u nl.lid\u van、tblTreeview\u nl.omschrijving、tblTreeview\u nl.doctype、tblTreeview\u nl.docnaam,其中tblTreeview\u nl.omschrijving类似“%”和escape(request.form(“searchbox”)和“%””
rsTreeview2.打开strSQL,adoCon
recordsetToString(rsTreeview2)
rsTreeview2.关闭
设置rsTreeview2=Nothing
设置adoCon=Nothing
如果结束
%>
函数搜索树(表单){
返回false;
};

上面的代码应该可以工作,只是不要从javascript函数返回false。返回True使表单提交。感谢您的回复,我已经实现了转义函数。但是,我不清楚您的解决方案如何始终从文本框中获取当前值。何时执行代码“if hasValue(request.form(“searchbox”)”?我们不需要把它放在searchTree函数中吗?问题是在返回true之后,页面将被重新加载,而我刚刚编写的treeview将消失。我怎样才能防止呢?第一次加载页面时,搜索框将是空的,您可以填写它。当您单击“提交”时,页面将自动发布,您实际上不需要“onsubmit”功能,如果您愿意,请将其删除。当页面发布到自身时,它将重新加载,但不同的是,您在文本框中输入的值现在将与它一起传递,因此“if hasValue(request.form(“searchbox”)…”将变为TRUE,并且将使用您在文本框中输入的值加载记录集。提交时无法阻止页面重新加载,必须重新绘制树视图。如果希望树保持不变,并且希望搜索现有树,则必须完全使用javascript。您不需要表单,只需要一个文本框和一个按钮,单击按钮即可使用文本框中的文本在树视图中搜索。但这是一个完全不同的话题:)
<%

function hasValue(value)
    hasValue = NOT(isNull(value) OR value="")
end function

function escape(inputValue)
    if hasValue(inputValue) then
        escape  = Replace(inputValue, "'", "''")
    end if
end function

function recordsetToString(rs)
    Dim objField
    recordsetToString   = ""
    recordsetToString   = recordsetToString & "<table class=""dbgtable"">"
    recordsetToString   = recordsetToString & "<tr>" & vbNewLine
    For Each objField in rs.Fields
    recordsetToString   = recordsetToString & "<th>" & objField.Name & "</th>" & vbNewLine
    Next
    recordsetToString   = recordsetToString & "</tr>" & vbNewLine
    if NOT rs.EOF then
        Do While Not rs.EOF
            recordsetToString   = recordsetToString & "<tr>" & vbNewLine
            For Each objField in rs.Fields
                recordsetToString   = recordsetToString & "<td>"
                if isNull(objField.Value) then
                    recordsetToString   = recordsetToString & "<i>NULL</i>"
                else
                    if vartype(objField.Value)>20 then
                        recordsetToString   = recordsetToString & typename(objField.Value)
                    else
                        recordsetToString   = recordsetToString & objField.Value
                    end if
                end if
                recordsetToString   = recordsetToString & "</td>" & vbNewLine
            Next
            recordsetToString   = recordsetToString & "</tr>" & vbNewLine
        rs.MoveNext
        Loop
        if rs.CursorType>0 then
            rs.movefirst
        end if
    end if
    recordsetToString   = recordsetToString & "</table>" & vbNewLine
end function

if hasValue(request.form("searchbox")) Then
Dim adoCon
Set adoCon = Server.CreateObject("ADODB.Connection") 
    adoCon.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("[PATH_TO_DATBASE]") 
    Dim rsTreeview2
    Set rsTreeview2 = Server.CreateObject("ADODB.Recordset") 
        strSQL = "SELECT tblTreeview_nl.volgnr, tblTreeview_nl.lid_van, tblTreeview_nl.omschrijving, tblTreeview_nl.doctype, tblTreeview_nl.docnaam FROM tblTreeview_nl WHERE tblTreeview_nl.omschrijving LIKE '%" & escape(request.form("searchbox")) & "%'"
        rsTreeview2.Open strSQL, adoCon 
            recordsetToString(rsTreeview2)
        rsTreeview2.Close 
    Set rsTreeview2 = Nothing 
Set adoCon = Nothing 
end if
%>


<script language="JavaScript">
function searchTree(form) {
    return false;
};
</script>