请考虑以下注册:
<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中。
提前感谢您提供有关解决此问题的任何提示。
答案 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);
}