几个小时一直玩这个,似乎无法理解它。
在Wicket中,List Choice采用一系列模型来表示构成列表的选项。当提交添加列表选择的表单时,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将尝试将整个LocationModel绑定到FormModel,显然我只想绑定它的 locationId 属性。
我已经在使用ChoiceRenderer,但这似乎仅在表单呈现时才提交。
结果是一个终极类强制转换异常,因为Wicket无法将LocationModel转换为整数。
我不想专门为表单创建另一个模型来接受LocationModel。
有什么想法吗?
答案 0 :(得分:5)
DropDownChoice
(选定值)的Model对象始终是选项List中的对象之一。因此,不可能提供一个元素属于一种类型的选择列表,并将选择存储在DropDownChoice
的{{1}}中的不同类型的对象中(*)。
只需提供Model
即可。如果您使用List<Integer>
作为locationId
的文字,则无需<option>
。否则,您的IChoiceRenderer
应该提供IChoiceRenderer
的说明,例如调用辅助函数locationId
。
如果getDescriptionForLocationId(Integer locationId)
函数的实现成本很高,可以使用另一种方法:
getDescriptionForLocationId
的自定义IModel
(或在Map<Integer, String>
期间进行构建),并在其getObject()
中返回getObject()
中的密钥}。这将提供List作为DropDownChoice的选择。Map
课程中实施getDescription()
方法,该方法将在IModel
中查询Map
的说明。 Integer
中,获取IChoiceRenderer
的模型并调用其DropDownChoice
以获取正确的说明。这是一个小样本:http://pastebin.com/DhKbsdQz
请注意这种方法的缺点:getDescription()
将与Map
一起序列化(为了提高效率,它也可能会延长LoadableDetachableModel
)
(*)考虑到这一点,Wicket在幕后使用Model
来建立ddc的ModelObject与选择列表中的元素之间的对应关系,因此它的逻辑就是这样的。< / p>