【问题标题】:How can i use Apache Wicket to process multiple model instances on a single form?如何使用 Apache Wicket 在单个表单上处理多个模型实例?
【发布时间】:2014-05-21 15:44:24
【问题描述】:

我正在使用 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);

我遇到的问题是,上面的代码为myListResult 中的每个项目添加了ididoperNam,并且由于重复的id 元素在html。我也试过这样做:

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 的外观如下图所示:

【问题讨论】:

    标签: arrays hibernate model-view-controller wicket


    【解决方案1】:

    您应该使用Repeater 来添加您的TextFields。例如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 以获得更少的代码:)

    【讨论】:

    • 嘿,我编辑了这个问题,希望听起来更清晰
    • 你明白我的回答了吗?或者在中继器上查找检票口文档?您将需要一个对象列表。该对象可以包含 slaNam 和 operNam。如果您将它们公开或提供 getter 和 setter,您可以简单地将它们与 itemModel 上的 PropertyModel 一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多