在表单帖子问题上保存复选框状态

时间:2011-06-30 12:07:45

标签: html arrays vbscript asp-classic checkbox

我在表单上设置复选框的未选中状态时遇到问题。我有超过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) %>">&nbsp;
        <% 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

5 个答案:

答案 0 :(得分:1)

检查生成的源代码以查看它生成的内容 从我所看到的,一个问题是,当您提交表单时,只会检查已选中的复选框,因此,如果您最初有10个复选框并检查其中3个并发布,则只有3个将发回(并且从代码中,我猜测在提交后只显示那3个复选框,所有复选框都已选中)。
您需要在第一次运行中保存所有复选框(例如,使用默认的空值,如空格),然后在检查时更改其会话值

答案 1 :(得分:1)

复选框是实际项目,例如类别或选项? 我问的原因是,如果你设置复选框,这些复选框是如何定义的?他们是静态的领域还是动态的?我希望充满活力。

以下是你如何做好准备。

  1. 创建一个名为news(newsid,newstxt)
  2. 的表
  3. 创建一个名为categories(catid,catxt)的表
  4. 创建一个名为NewscatSelected(ncsid,newsid,catid)的表,用于存储所选类别的复选框以及相关的newsid
  5. 复选框页面表单(cb1.asp)

    1. 将newsid作为查询字符串发送到页面(cb1.asp?newsid = 34)
    2. 动态列出所有类别作为复选框,并从NewscatSelected获取所有记录并将其配对。将检查表NewscatSelected中存在的任何项目。它们将具有相同的名称,但使用下划线和类别的数值(cbt_34)来轻松区分它们
    3. 3。

      更新页面表单(cb2.asp)

      1. 获取querystring后,删除发送的newsid的任何现有值以避免重复
      2. 将新检查的值插入名为“ NewscatSelected
      3. 的表格中
      4. 重定向回(cb1.asp?newsid = 34)并检查新值。
      5. 见下图

        A visual representation

答案 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个!