播放使用「未解決的參數被安全忽略,類型不匹配也被安全地忽略。將參數綁定到POJO時。它大部分時間都很好用。POJO,JPA綁定和複選框
但是這會導致複選框出現問題,因爲未選中的複選框不會在參數列表中發送。
CRUD模塊通過在複選框後面插入一個隱藏的輸入域來解決這個問題。這是可行的,因爲Play只讀取要綁定的兩個相同參數中的第一個參數。從CRUD模塊
源,顯示一個複選框:
<input id="object_isInvoiceable" type="checkbox" name="object.isInvoiceable" />
<input type="hidden" name="object.isInvoiceable" value="false" />
另一種方法是通過不使複選框作爲對象的成員,但作爲單獨的參數。然後可以趕上這在控制器和設置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仍然是true。
謝謝你的回答。不幸的是,這不適用於已存儲的JPA對象。我之前的帖子中有點不清楚,並且對它進行了編輯。 – Franz 2012-01-10 07:42:33
謝謝。似乎是合理的解決方法。另一種方法是將選擇框放在Yes/No或類似的位置。 – Franz 2012-01-10 08:52:32