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

时间:2012-03-23 14:23:55

标签: java apache wicket

几个小时一直玩这个,似乎无法理解它。

在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。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

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

只需提供Model即可。如果您使用List<Integer>作为locationId的文字,则无需<option>。否则,您的IChoiceRenderer应该提供IChoiceRenderer的说明,例如调用辅助函数locationId

如果getDescriptionForLocationId(Integer locationId)函数的实现成本很高,可以使用另一种方法:

  1. 实施收到getDescriptionForLocationId的自定义IModel(或在Map<Integer, String>期间进行构建),并在其getObject()中返回getObject()中的密钥}。这将提供List作为DropDownChoice的选择。
  2. 在自定义Map课程中实施getDescription()方法,该方法将在IModel中查询Map的说明。
  3. Integer中,获取IChoiceRenderer的模型并调用其DropDownChoice以获取正确的说明。
  4. 这是一个小样本:http://pastebin.com/DhKbsdQz

    请注意这种方法的缺点:getDescription()将与Map一起序列化(为了提高效率,它也可能会延长LoadableDetachableModel

    (*)考虑到这一点,Wicket在幕后使用Model来建立ddc的ModelObject与选择列表中的元素之间的对应关系,因此它的逻辑就是这样的。< / p>