如何使用Apache Wicket在单个表单上处理多个模型实例?

时间:2014-05-21 15:44:24

标签: arrays hibernate model-view-controller wicket

我正在使用Wicket生成表单,以允许用户为多个模型对象设置值。每个模型对象都有两个字段operNamslaNamoperNam值列表取自参数字符串operationNames,我将这个以空格分隔的列表拆分,如下所示,并将每个列表放入名为myListResult的ArrayList中。

String result = parameters.getString("operationNames");
        //split list
        ArrayList<String> myListResult = new ArrayList<String>(Arrays.asList(result.split(" ")));
        for (String word : myListResult) {
            System.out.println("===>" +  word);
        }

我想要做的是为用户创建一个表单,其中myListResult中的每个条目都有两个元素。我添加的TextField包含myListResult中每个操作名称的值和空TextField,以允许用户输入slaNam的值。我目前用来执行此操作的代码如下:

for(String operation : myListResult) {
    form.add(new TextField<String>("operNam" , new PropertyModel<String>(operation, "operNam")));   
    form.add(slaNam);
}
add(form);

我遇到的问题是上面的代码为TextField中的每个项目添加了id operNam值为myListResult的{​​{1}},这就是错误到期复制html中的id个元素。我也试过这样做:

for(String operation : myListResult) {
    form.add(new TextField<String>(operation , new PropertyModel<String>(operation, "operNam")));   
    form.add(slaNam);
}
add(form);

这可以避免重复id元素的问题,但会导致问题,因为现在我的表单元素没有映射到我的模型对象,该对象需要一个名为operNam的字段和另一个名为slaNam的字段

我的问题是

如何在不使用重复元素id名称的情况下创建表示任意数量模型的表单元素。

如果我在myListResult中有4个项目,那么下图是我希望html看起来如何: example of page for 4 elements in <code>myListResult</code>

1 个答案:

答案 0 :(得分:6)

您应该使用Repeater添加TextField。例如ListView

ListView listview = new ListView("listview", list) {
    protected void populateItem(ListItem item) {
        item.add(new TextField("textField", item.getModel()));
    }
};

使用合适的HTML:

<span wicket:id="listview">
   <input wicket:id="textField" type="text"></input><br/>
</span>

要在每行中使用多个字段,最简单的解决方案是使用包含以下字段的对象:

public class MyRow
{
    public String slaNam;
    public String operName;
}

并创建一个List

List<MyRow> myRows = new ArrayList<>();

并在ListView

中使用此列表
ListView<MyRow> listview = new ListView("listview", myRows)

您可以在populateItem

中使用此功能
 protected void populateItem(ListItem<MyRow> item) {
        item.add(new TextField("slaNam", new ProperyModel(item, "slaNam")));
        item.add(new TextField("operName", new ProperyModel(item, "operNam")));
    }

或者,使用ProperyListView代码更少:)