我创建了一个简单的wicket表单,其中包含DropDownChoice,一个提交按钮和两个TextFields,以便尝试一些模型链接。 html:
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<head>
<meta charset="utf-8" />
<title>DropDownTest</title>
</head>
<body>
<form wicket:id="selectForm">
<select wicket:id="dropDown"></select>
<input type="submit" wicket:id="bt"/>
<input type="text" wicket:id="age"/>
<input type="text" wicket:id="name"/>
</form>
</body>
</html>
和java代码:
public class HomePage extends WebPage {
private static final long serialVersionUID = 1L;
private class Person implements Serializable {
private int age;
private String name;
public Person(){};
public Person(int pAge, String pName) {
age = pAge;
name = pName;
}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
}
public List<Person> getPersons() {
List<Person> persons = new ArrayList<Person>();
persons.add(new Person(34, "Hanna"));
persons.add(new Person(17, "Ivan"));
persons.add(new Person(64, "Carol"));
return persons;
}
private Form form;
private DropDownChoice<Person> dropDown;
public HomePage(final PageParameters parameters) {
super(parameters);
Model<Person> personModel = new Model<Person>();
dropDown = new DropDownChoice<Person>("dropDown", personModel, getPersons(),
new ChoiceRenderer<Person>("name"));
form = new Form("selectForm");
form.add(new TextField("name", new PropertyModel(personModel, "name")));
form.add(new TextField("age", new PropertyModel(personModel, "age")));
form.add(dropDown);
form.add(new Button("bt"));
add(form);
}
}
下拉选项和两个文本字段共享相同的模型(personModel),因此当用户从下拉列表中选择一个人并提交表单时,单击该按钮并重新加载页面,这两个字段将从所选的人员中获取他们的值该模型。这按预期工作,我没有错误。现在,如果我改变从这个(工作)添加组件到表单的顺序:
form.add(new TextField("name", new PropertyModel(personModel, "name")));
form.add(new TextField("age", new PropertyModel(personModel, "age")));
form.add(dropDown);
到此(不工作)
form.add(dropDown);
form.add(new TextField("name", new PropertyModel(personModel, "name")));
form.add(new TextField("age", new PropertyModel(personModel, "age")));
提交表单时出错:
方法[public int com.asbjorntest.HomePage $ Person.getAge()]。无法将null值转换为原始类:int用于在com.asbjorntest.HomePage$Person@71460b93上设置它
我知道这个错误来自于我提交&#34; age&#34; textfield没有任何值,并且不能转换为Person类中的int。但是,为什么只有在我在Java代码中添加文本字段之前添加下拉选项时才会发生此错误?或许我应该问:为什么我以后添加它不会发生?我在java代码中向组件或页面添加组件的顺序是否重要,或者我在这里完全遗漏了某些内容?
提前感谢任何答案或线索!
答案 0 :(得分:1)
我认为HTML
中的顺序是无关紧要的。 Java
中的顺序可能相关,因为组件的顺序决定了它们的验证方式。
当您将DropDownChoice
置于最新状态时,null
中的age
TextField
将被您在下拉列表中选择的值覆盖,并且一切正常。< / p>
如果您反过来放置组件,age
将为null
(来自TextField
的值,您将收到错误。
简而言之:在多个组件编辑相同模型值时要小心。
答案 1 :(得分:0)
据我所知,不鼓励在组件之间共享模型,因此建议为每个组件创建一个新模型。
请注意,当您创建personModel
时,最初没有附加具体人员,我怀疑它是在添加到页面时创建的。因此,在创建文本字段并将其添加到表单时,模型的人员为空。
总而言之,我建议你这样:
public HomePage(final PageParameters parameters) {
super(parameters);
Person person = new Person();
form = new Form("selectForm");
dropDown = new DropDownChoice<Person>("dropDown", new Model<Person>(person), getPersons(), new ChoiceRenderer<Person>("name"));
form.add(dropDown);
// I think you can use person as first parameter, else use new Model<Person(person),
form.add(new TextField("name", new PropertyModel(person, "name")));
form.add(new TextField("age", new PropertyModel(person, "age")));
form.add(new Button("bt"));
add(form);
}
无论如何,因为我会使用Wicket,所以我可能完全错了:P