2012-03-23 69 views
1

一直在玩這個幾個小時,似乎無法讓我的頭靠近它。Wicket:避免將ListChoice的模型分配給表單的模型

在Wicket中,List Choice將列出將表示構成列表的選項的模型。當提交List Choice的表單被提交時,Wicket會將選擇的模型綁定到Form的模型上。

但是如果我不希望整個模型被綁定,而是一個特定的屬性呢?

例如:

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> 

當提交表單時,檢票將嘗試綁定整個LocationModel到FormModel,其中清楚我只是想綁定它locationId財產。

我已經在使用ChoiceRenderer,但似乎只在表單呈現時才起作用。

結果是最終的類轉換異常,因爲Wicket無法將LocationModel轉換爲整數。

我不想創建另一個模型專門用於接受LocationModel的表單。

有什麼想法?

回答

5

DropDownChoice(選定值)的模型對象始終是選擇列表中的對象之一。因此,不可能提供元素爲一種類型的選項列表,並將選擇存儲在DropDownChoiceModel中的不同類型(*)的對象中。

只需提供一個List<Integer>。如果您確定locationId<option>的文本,則IChoiceRenderer將不是必需的。否則,您的IChoiceRenderer應與locationId一起提供說明,例如撥打輔助功能getDescriptionForLocationId(Integer locationId)

如果getDescriptionForLocationId功能的實現將是昂貴的,還有另一種方法,您可以使用:

  1. 實現接收一個Map<Integer, String>定製IModel(或期間getObject()建立起來),並在其getObject(),從Map返回密鑰。這將提供一個List作爲DropDownChoice的選擇。
  2. 在您的自定義IModel類中執行getDescription()方法,該類將查詢Map以獲取Integer的說明。
  3. IChoiceRenderer中,獲取DropDownChoice的型號,並命名爲getDescription()以獲取正確的說明。

這裏有一個小例子:http://pastebin.com/DhKbsdQz

請注意這種方法的缺點:Map將隨着Model得到序列化(也有可能是延長LoadableDetachableModel爲了提高效率)

(*)考慮到它,Wicket在幕後使用equals()來建立ddc的ModelObject和選擇列表中的元素之間的對應關係,所以它的邏輯事情就是這樣。

+0

只是爲了確保我理解正確;你是說讓列表選擇一個整數列表,並在我的IChoiceRenderer裏面,顯示每個ID所代表的相關位置? – 9ee1 2012-03-23 14:33:11

+0

確實。如果拉動描述是昂貴的,請參閱我的編輯以獲取替代方案 – 2012-03-23 15:14:40

+0

你的例子效果很好。感謝您的詳細解答。 – 9ee1 2012-03-23 17:59:47