2012-03-23 9 views
1

これを数時間かけて遊んでいて、周りに頭を浮かべているように見えません。Wicket:ListChoiceのモデルをフォームのモデルに割り当てることを避ける

はWicketでは、リストの選択は、リストを作るの選択肢を表現するモデルのリストを取ります。 List Choiceが追加されたFormが送信されると、Wicketは選択した選択肢のモデルをフォームのモデルにバインドします。

しかし、モデル全体がバインドされず、代わりに特定のプロパティが必要な場合はどうなりますか?例えば

public class FormModel { 
     private int locationId; 

     public void setLocationId(int id) { 
      this.locationId = id; 
     } 
    } 

    public class LocationModel { 
     private int id; 

     public int getId() { 
      return this.id; 
     } 
    } 

    <select wicket:id="LocationId" id="LocationId" name="LocationId" size="1"> 
     <option value="#">#</option> 
    </select> 

フォームが送信されると、Wicketのは明らかに、私はちょうどそれがプロパティをlocationIdだバインドするFormModelに全体LocationModelをバインドしようとします。

は、私はすでにChoiceRendererを使用していますが、それは、それが送信されたときにフォームがないレンダリングされたときに動作するようです。

結果は、自動改札が整数にLocationModelを変換することはできないので、最終的なクラスキャスト例外です。

フォーム用に別のモデルを作成して、LocationModelを受け入れることは嫌です。

どのような考えですか?

答えて

5

DropDownChoice(選択された値)のモデルオブジェクトが常に選択リストの目的の一つです。したがって、要素が1つのタイプである選択肢のリストを提供することはできず、異なるタイプ(*)のオブジェクトのDropDownChoiceModelに選択を保存します。

List<Integer>をご提供ください。あなたはlocationIdとして<option>のテキストとしてOKなら、IChoiceRendererは必要ありません。それ以外の場合は、IChoiceRendererにはlocationIdの説明が表示されます(たとえば、ヘルパー機能getDescriptionForLocationId(Integer locationId))。

そのgetDescriptionForLocationId機能の実装は高価になる場合は、使用することができます別のアプローチがあります:

  1. Map<Integer, String>を受信(またはgetObject()中にそれを構築)カスタムIModelを実装し、そのgetObject()で、 Mapからキーを返します。それはDropDownChoiceの選択肢としてListを提供します。
  2. カスタムIModelクラスにgetDescription()メソッドを実装して、Integerの説明をMapに照会します。 IChoiceRenderer
  3. DropDownChoiceのモデルを取得し、適切な説明を取得するために、そのgetDescription()を呼び出します。

ここで少しのサンプルです:http://pastebin.com/DhKbsdQz

は、このアプローチの欠点を注意してください:MapModelと一緒にシリアライズされます(*)

を(それはまた、効率化のためLoadableDetachableModelを拡張することができます)それを考えて、WicketはddcのModelObjectと選択リストの要素との間の対応関係を確立するために、舞台裏でequals()を使用します。そのため、ロジックはこのようになります。

+0

私が正しく理解していることを確認するだけです。リストの選択肢に整数のリストを与え、IChoiceRendererの中に、表示されたときに各IDによって表される関連する位置を引っ張ると言っていますか? – 9ee1

+0

確かに。説明を引き出すのが高価な場合は、私の編集を参照してください。 –

+0

あなたの例はうまくいきました。素晴らしい詳細な答えをありがとう。 – 9ee1

関連する問題