在表单内处理ListView

时间:2011-12-11 15:53:07

标签: wicket wicket-1.5

请考虑以下注册:

<form wicket:id="form">
  <div wicket:id="fooList">                                        
    <input wicket:id="fooList.quxField" type="text" size="10"/>
  </div>                
  <button wicket:id="submit"><wicket:message key="submitText"/></button>    
</form>

这两个课程(我假设有制定者,吸气者等)。

class FooClazz {        
    String quxField;
}

class BarClazz {
    List<FooClazz> fooList;
}

此表单(模型包含在CompoundPropertyModel中):

class BarForm extends Form<BarClazz> {
  public BarForm(String id,final IModel<BarClazz> model){
    super(id,model);
    add(new ListView<FooClazz>("fooList"){
      @Override
      protected void populateItem(final ListItem<FooClazz> item){
        item.add(new TextField<String>("fooList.quxField"));
      }                   
    }
  }
}

现在上面的代码为我生成了一个运行时异常:

2011-12-11 16:33:46 ERROR [org.apache.wicket.DefaultExceptionMapper] Unexpected error occurred org.apache.wicket.WicketRuntimeException: The expression 'quxField' is neither an index nor is it a method or field for the list class java.util.ArrayList

我可以将TextField更改为包含这样的模型:

item.add(new TextField<String>("fooList.quxField", new Model<String>(model.getObject().getFooList().getQuxField())));

这解决了错误,但是当我提交表单(带有Ajax按钮)时,我永远不会看到输入到表单字段中的值。

那么如何将TextField模型保持连接到我的表单模型?我忽略了明显的吗? (这当然只是我原始代码的缩短版本......)

需要添加:我的所有模型都包含在CompoundPropertyModels中。

提前感谢您提供有关解决此问题的任何提示。

1 个答案:

答案 0 :(得分:5)

我找到了。我需要为TextField包含一个模型,该模型具有getObject()和setObject()的实现。所以我真的错过了显而易见的事实。

@Override
protected void populateItem(final ListItem<Taste> item) {
    final TextField<String> quxField = new TextField<String>("tastes.quxField", new Model<String>() {
        @Override
        public String getObject() {
            return item.getModel().getObject().getquxField();
        }

        @Override
        public void setObject(final String value) {
            item.getModel().getObject().setquxField(value);
        }
    });
    item.add(quxField);
}