2012-01-09 5 views
4

再生 "未解決のパラメータは安全に無視されます。タイプの不一致も無視されます。" POJOにパラメータをバインドするとき。ほとんどの場合、これは非常に効果的です。POJO、JPAのバインドとチェックボックス

しかし、このチェックボックスをオンにすると、パラメータリストにチェックマークが付いていないチェックボックスが送信されないため、チェックボックスに問題が発生します。

CRUDモジュールは、チェックボックスの直後に隠れた入力フィールドを挿入することでこれを解決しました。これは、Playがバインドする2つの同一パラメータのうちの最初のものだけを読み込むためです。

チェックボックスを表示するCRUDモジュールからソース:

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

別の方法は、オブジェクトのメンバーとしてではなく別のパラメータとしてチェックボックスを通過しないことです。

<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を好きではないこのように、コントローラでこれをキャッチし、そこobject.memberを設定することが可能ですすべてのブラウザでparamsの順序が正しく送信されていることを確認してください。

オブジェクトを変更すると、別のパラメータを管理してコントローラメソッドを変更する必要があるため、代替2が嫌いです。

これを行うにはいくつかの方法がありますか?私はPlay Frameworkの新機能ですから、Annotationなどを見逃したかもしれません。

編集:

以前は少し不明でした。問題は新しいオブジェクトを作成するときではなく、CodemwnciのようにFALSEに設定することができます。問題は、既存のJPAオブジェクトにバインドする場合です。 playframework tutorialから

あなたは自動的にJavaバインディングにHTTPを使用して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; 
    ... 
    ... 
} 

、あなたはjQueryのを置くことによって、CRUDが使用するテーマにわずかな変化を行うことができ、チェックボックスの値は常に隠しを設定するように、それに対してアクションを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

+0

ありがとうございます。合理的な回避策のようです。もう一つは、はい/いいえなどの選択ボックスだけを置くことです。 – Franz

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

が私に適しています。

関連する問題