我在表单上设置复选框的未选中状态时遇到问题。我有超过1000个复选框,到目前为止我能够检查每个复选框n保存检查状态。然而,我的问题是取消选中复选框。
我也在页面上使用分页,如下面的代码所示(提交按钮的值是存储过程的参数) -
<center><input id="buttonStyle" type="submit" name="Page" value="#">
<% for i = 97 to 122 %>
<input id="buttonStyle" type="submit" name="Page" value="<%=CHR(i) %>">
<% next %></center>
<input id="buttonStyle" type="submit" name="Page" value="View All">
当我查看每个字母时,我需要保存我的检查状态。到目前为止,由于shadowwizard的帮助,如果我单击查看所有按钮,我可以保存已选中和未选中的复选框状态。但是现在的问题是,当我单击另一个字母(例如 - a,b,c)时,单击全部查看时将删除任何已检查状态。
<%
Dim tempArray
Dim checkArray
Dim temphiddenArray
Dim hiddenArray
'CheckBox Selection Array
if len(Request.Form("selectedRecord")) > 0 then tempArray = split(Request.Form("selectedRecord"), ",")
if isarray(tempArray) then
redim checkArray(ubound(tempArray))
'Create CheckArray ARRAY
for i = lbound(tempArray) to ubound(tempArray)
checkArray(i) = trim(tempArray(i))
next
'Hidden Array check
if len(request.Form("hiddenArray")) > 0 then temphiddenArray = split(request.Form("hiddenArray"), ",")
if isarray(temphiddenArray) then
redim hiddenArray(ubound(temphiddenArray))
for i = lbound(hiddenArray) to ubound(hiddenArray)
hiddenArray(i) = trim(temphiddenArray(i))
Session("LastCheck_"&i) = hiddenArray(i)
next
if ubound(hiddenArray) >= ubound(checkArray) then
for i = lbound(hiddenArray) to ubound(hiddenArray)
Session("CheckBox_"&(Session("LastCheck_"&i))) = ""
next
end if
end if
for i = lbound(checkArray) to ubound(checkArray)
Session("CheckBox_"&checkArray(i)) = "Checked"
%>
<input type="hidden" name="hiddenArray" value="<%=checkArray(i) %>">
<%
next
else
Session("CheckBox_"&request.Form("hiddenArray")) = ""
end if
%>
<% while not objRS.EOF %>
<input type="checkbox" name="selectedRecord" value="<%=objRS("Id") %>" <%=Session("CheckBox_"&objRS("Id")) %>>
objRS.MoveNext
wend
答案 0 :(得分:1)
检查生成的源代码以查看它生成的内容
从我所看到的,一个问题是,当您提交表单时,只会检查已选中的复选框,因此,如果您最初有10个复选框并检查其中3个并发布,则只有3个将发回(并且从代码中,我猜测在提交后只显示那3个复选框,所有复选框都已选中)。
您需要在第一次运行中保存所有复选框(例如,使用默认的空值,如空格),然后在检查时更改其会话值
答案 1 :(得分:1)
复选框是实际项目,例如类别或选项? 我问的原因是,如果你设置复选框,这些复选框是如何定义的?他们是静态的领域还是动态的?我希望充满活力。
以下是你如何做好准备。
复选框页面表单(cb1.asp)
更新页面表单(cb2.asp)
见下图
答案 2 :(得分:1)
你正在穿越整片森林,而不是攀爬一棵短树,换句话说,让一些简单的东西变得非常复杂。
您需要的是此功能:
<%
Function WasCheckedByUser(id)
Dim x
WasCheckedByUser = "checked=""checked"""
For x=1 To Request.Form("selectedRecord").Count
If Trim(Request.Form("selectedRecord").Item(x))=Trim(id) Then
Exit Function
End If
Next
WasCheckedByUser = ""
End Function
%>
然后像这样使用它:
<input type="checkbox" name="selectedRecord" value="<%=objRS("Id") %>" <%=WasCheckedByUser(objRS("Id")) %>/>
不需要数组,不需要Session变量。只需对已发布的值进行简单迭代(这是已选中复选框的值),如果存在特定值,则表示应选中相应的复选框,否则请将其保留为未选中状态。
编辑:你失去了“状态”,因为当你点击特定字母时,你只向浏览器发送部分复选框 - 所以之前的值确实“丢失”了。
最简单的解决方法是将所有复选框发送到浏览器 - 始终 - 并使用简单的样式隐藏您当前根本不发送的复选框。
因此,您必须更改用于填充objRS
的SQL以始终选择全部,并将循环更改为:
<%
Do Until objRS.EOF
Response.Write("<input type=""checkbox"" name=""selectedRecord"" value=""" & objRS("Id") & """ " & WasCheckedByUser(objRS("Id")))
If Len(Request.Form("Page"))=1 And Trim(Left(objRS("Id"), 1))<>Trim(Request.Form("Page")) Then
Response.Write(" style=""display: none;""")
End If
Response.Write(" />")
objRS.MoveNext
Loop
%>
据我所见,它应该可以工作,现在即使是隐藏的复选框也能保留状态。
答案 3 :(得分:1)
我刚刚在这里提出了这个问题的答案:
how to implement a check box in classic asp
它专为非顺序编号,动态创建的复选框而设计,这些复选框需要传递唯一的ID值以及选中或取消选中。
该解决方案确实需要每个复选框的隐藏字段,但它不使用Javascript或任何客户端编程。
答案 4 :(得分:0)
正如之前的回答所述,复选框在取消选中时不会被回发,因此请求对象中没有任何内容代表未选中的复选框,如果您知道要回发的所有内容,这很好,但是如果它完全是动态的,然后用的不多。
我之前使用过的一个解决方法是使用隐藏字段作为实际数据,并使用复选框来控制(通过JS)相关隐藏字段的值,但是我不知道该解决方案将如何执行你在页面上有1000个!