【问题标题】:Deleting multiple rows using checkboxes in Struts2使用 Struts2 中的复选框删除多行
【发布时间】:2014-01-22 18:33:20
【问题描述】:

我在 HTML 表格中显示行,表格每一行的列中都有一个复选框,如下所示。

<s:iterator value="objects" status="loopStatus">

    <td>
        <s:label for="%{id}" value="%{#loopStatus.index+1}"/>
        <s:checkbox id="%{id}" name="chk" fieldValue="%{id}" value="false"/>
    </td>

    <!--Other columns-->

</s:iterator>

objects 是 JPA 实体的对象列表,List&lt;Entity&gt; 在动作类中初始化。 idLong 类型的值,对应于数据库中的主键列。


当提交表单时,这些复选框的值被设置为动作类中的相应属性。

private List<Long>chk;

//setters & getters.

选中复选框的值已正确设置为此属性chk。然后使用此值列表从数据库中删除行。


这很好用。当表中只有一行时,就会出现问题。在这种情况下,在执行除删除以外的操作(如更新/插入行)时会发生不必要的转换错误,这需要选中此复选框,这是非常不必要的,应该只在执行删除时发生。

字段“chk”的字段值无效。

如果我故意添加一个额外的同名复选框chk,那么这个转换错误就会消失。

据推测,单个复选框似乎未正确映射到 LongList&lt;Long&gt; 类型的值列表。

当HTML表格中只有一行要显示时,有什么方法可以消除这个错误?

【问题讨论】:

    标签: java checkbox struts2 delete-row


    【解决方案1】:

    如果您不选中单个复选框,则默认值设置为false。您可以在checkbox拦截器uncheckedValue属性中设置默认值。

    另外您可以考虑添加隐藏字段,以便checkbox 拦截器在只有一个复选框时会认为有多个复选框并且不会添加默认值。

    对于您的复选框,隐藏字段名称将为 __checkbox_chk

    <s:hidden name="__checkbox_chk"/>
    

    【讨论】:

    • &lt;input type="hidden" id="__checkbox_23" name="__checkbox_chk" value="23"&gt; 这样的隐藏字段已经添加到每个复选框中,那么为什么需要这个额外的隐藏字段呢?这工作正常。谢谢。
    • @Tiny:添加额外的隐藏字段会使拦截器认为有多个复选框并且没有设置默认值。
    【解决方案2】:

    试试这个明确引用数组索引的:

    <s:iterator value="objects" status="loopStatus">
    
        <td>
            <s:label for="%{id}" value="%{#loopStatus.index+1}"/>
            <s:checkbox id="%{id}" name="chk[%{#loopStatus.count}]" fieldValue="%{id}" value="false"/>
        </td>
    
        <!--Other columns-->
    
    </s:iterator>
    

    【讨论】:

    • 我试过name="chk[%{#loopStatus.count}]"name="chk[]"。有问题的错误消失了,但在这两种情况下,选定复选框的值都没有设置到列表中,同时删除行不允许删除行。我也尝试将List&lt;Long&gt;chk 转为Long chk[],但这也没有什么不同。
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多