POJO,JPA绑定和复选框

时间:2012-01-09 21:31:57

标签: playframework

播放使用“安全地忽略未解析的参数。也可以安全地忽略类型不匹配。”将参数绑定到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

  

您可以使用HTTP到Java绑定自动绑定JPA对象。

     

您可以在HTTP参数中自己提供user.id字段。当Play找到id字段时,它会在编辑之前从数据库中加载匹配的实例。然后应用HTTP请求提供的其他参数。所以你可以直接保存它。

在这种情况下,它不会将成员值设置为任何默认值。

例如,我已经在数据库中存储了一个JPA对象,其中isInvoiceable设置为TRUE。我将此对象渲染到模板。如果我现在取消选中该复选框,则不会发送参数,因此isInvoiceable仍然是真的。

2 个答案:

答案 0 :(得分:1)

对于新对象,您可以执行以下操作

如果您绑定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代码,但是你明白了。

答案 1 :(得分:0)

我有另一个解决方案,它避免了模板中隐藏/额外字段的需要。

观看代码:

<input id="object_isInvoiceable" type="checkbox" name="object.isInvoiceable" />

控制器代码:

public static void save(Event object) {
    if(params.get("object.isInvoiceable") == null) {
        object.isInvoiceable = false;
    }

    ... validation etc ...

    object.save();

    ... render etc ...
}

适合我。