2012-01-09 66 views
4

播放使用「未解決的參數被安全忽略,類型不匹配也被安全地忽略。將參數綁定到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。

回答

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代碼,但你的想法。

+0

謝謝你的回答。不幸的是,這不適用於已存儲的JPA對象。我之前的帖子中有點不清楚,並且對它進行了編輯。 – Franz 2012-01-10 07:42:33

+0

謝謝。似乎是合理的解決方法。另一種方法是將選擇框放在Yes/No或類似的位置。 – Franz 2012-01-10 08:52:32

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 ... 
} 

很適合我。