2012-03-23 60 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