gpt4 book ai didi

java - Wicket:避免将 ListChoice 的模型分配给表单的模型

转载 作者:行者123 更新时间:2023-11-29 08:08:01 25 4
gpt4 key购买 nike

我已经玩了几个小时了,但似乎无法理解它。

在 Wicket 中,列表选择采用模型列表,这些模型将表示构成列表的选择。提交添加了列表选项的表单时,Wicket 会将所选选项的模型绑定(bind)到表单的模型。

但是如果我不想绑定(bind)整个模型而是绑定(bind)一个特定的属性怎么办?

例如:

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 绑定(bind)到 FormModel,显然我只想绑定(bind)它的 locationId 属性。

我已经在使用 ChoiceRenderer,但它似乎只在呈现表单而不是提交时才有效。

结果是最终类转换异常,因为 Wicket 无法将 LocationModel 转换为整数。

我不想专门为表单创建另一个模型来接受 LocationModel。

有什么想法吗?

最佳答案

DropDownChoice 的模型对象(选择值)始终是选择列表中的对象之一。因此,不可能提供元素属于一种类型的选择列表,并将选择存储在 DropDownChoice 中。的 Model在不同类型的对象中 (*)。

只需提供一个 List<Integer> .万一你同意locationId作为<option>的文本,IChoiceRenderer没有必要。否则,您的 IChoiceRenderer应该用 locationId 来描述,例如调用辅助函数 getDescriptionForLocationId(Integer locationId) .

如果执行那getDescriptionForLocationId功能会很昂贵,您可以使用另一种方法:

  1. 实现自定义 IModel收到 Map<Integer, String> (或在 getObject() 期间建立),并在其 getObject() 中, 从 Map 返回 key .这将提供一个列表作为 DropDownChoice 的选择。
  2. 实现 getDescription()自定义方法 IModel将查询 Map 的类对于 Integer 的描述.
  3. IChoiceRenderer , 得到 DropDownChoice的模型并将其命名为 getDescription()以获得正确的描述。

这是一个小示例:http://pastebin.com/DhKbsdQz

请注意这种方法的缺点:Map将与 Model 一起连载(它也可以扩展 LoadableDetachableModel 以提高效率)

(*) 考虑一下,Wicket 使用 equals()背后是为了建立ddc的ModelObject和选择List中的元素的对应关系,所以它的逻辑是这样的。

关于java - Wicket:避免将 ListChoice 的模型分配给表单的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9840892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com