playframework – POJO,JPA绑定和复选框
Play使用“未解决的参数被安全忽略.类型不匹配也被安全地忽略.”将参数绑定到POJO时.它大部分时间都很好用.
但这会导致复选框出现问题,因为未在参数列表中发送未选中的复选框. CRUD模块通过在复选框后面插入一个隐藏的输入字段来解决这个问题.这是有效的,因为Play只读取要绑定的两个相同参数中的第一个. 来自CRUD模块的源,显示一个复选框: <input id="object_isInvoiceable" type="checkbox" name="object.isInvoiceable" /> <input type="hidden" name="object.isInvoiceable" value="false" /> 另一种方法是不将复选框作为对象的成员传递,而是作为单独的参数传递.然后可以在Controller中捕获它并在那里设置object.member,如下所示: <input id="object_isInvoiceable" type="checkbox" name="isInvoiceableExtraParamFromHell" /> 并在控制器中: public static void save(Event object,Boolean isInvoiceableExtraParamFromHell) { if(isInvoiceableExtraParamFromHell == null) { object.isInvoiceable = false; } else { object.isInvoiceable = true; } ... validation etc ... object.save(); ... render etc ... } 我不喜欢替代方案1,因为我如何确保在所有浏览器中正确发送参数的顺序. 我不喜欢替代2,因为如果我更改对象,我必须管理单独的参数并修改我的控制器方法. 有没有更好的方法来做到这一点?我是Play Framework的新手,所以我可能错过了一些注释或其他东西. 编辑: 我之前有点不清楚.问题不在于创建新对象时,我可以将其设置为默认为FALSE,如Codemwnci建议的那样.问题是绑定到现有的JPA对象时. 来自playframework tutorial:
在这种情况下,它不会将成员值设置为任何默认值. 例如,我已经有一个存储在数据库中的JPA对象,其isInvoiceable设置为TRUE.我将此对象渲染到模板.如果我现在取消选中该复选框,则不会发送参数,因此isInvoiceable仍然为true. 解决方法
对于新对象,您可以执行以下操作
如果您绑定POJO,那么只需在POJO中默认值就足够了. 例如 public class Event extends Model { public Boolean isInvoiceable = Boolean.FALSE; ... ... } 对于现有对象,您可以对CRUD使用的主题进行略微修改,方法是对其执行JQuery onclick操作,以便复选框的值始终设置隐藏值,并且将此隐藏值映射到POJO. 所以,例如 <input id="object_isInvoiceable_checkbox" type="checkbox" name="ignoredformfield" /> <input id="object_isInvoiceable_formfield" type="hidden" name="object.isInvoiceable" value="false" /> <script>$("#object_isInvoiceable_checkbox").click(function( $("object_isInvoiceable_formfield").value("$("#object_isInvoiceable_checkbox").is(":checked")"); ));</script> 注意:我没有检查过javascript代码,但是你明白了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |