我在理解自己做错事情时遇到了一些问题。
我做的事:
在我的应用程序中覆盖getHomePage()。我返回MyStartPage.class。
MyStartPage是MySubPage的子类。
MySubPage是MySuperPage的子类。
在MySuperPage中,我添加一个面板。此面板具有一个TextField和WebMarkupContainer,以及一个AjaxEventBehavior(onclick),用于打印文本字段的支持modelObject。
当我启动服务器并浏览localhost / MyApp时会发生什么:
即使我单击WebMarkupContainer时用户输入不是,打印的modelObject还是null。
当我启动服务器,浏览localhost / MyApp,转到应用程序中的另一个页面,然后返回MyStartPage时,会发生什么情况:
单击WebMarkupContainer时,打印的modelObject与用户输入匹配。
当我执行以下操作时,它也可以工作:
在我的应用程序中重写getHomePage()并返回MyLoginPage。 MyLoginPage包含MySigninPanel。在MySigninPanel中,我像这样重写onSignInSucceeded():
@Override
protected void onSignInSucceeded() {
setResponsePage(new MyStartPage());
}
有人可以阐明当用户首先单击WebMarkupContainer时使我的TextField正常工作的正确方法吗?
提前致谢!
//编辑:
这似乎仅在Firefox中是一个问题,或者至少在Chrome IE9和IE9中的IE8模式下可以正常工作。
最佳答案
除非您通过点击事件提交表单,否则不会使用用户输入的数据更新TextField的模型。您的TextField应该是该Form的子级。如果是,则将其内容发送到服务器,转换为目标类型并进行验证。成功后,您将可以查询模型并查看在页面上输入的数据。
为此,您应该使用AjaxFormSubmitBehavior而不是当前使用的AjaxEventBehavior:
webMarkupContainer.add(new AjaxFormSubmitBehavior(form, "onclick") {
@Override
protected void onSubmit(AjaxRequestTarget target) {
// You can now see what was entered in your TextField
System.out.println(textField.getModelObject());
}
@Override
protected void onError(AjaxRequestTarget target) {
// An error occurred and you should provide some kind of feedback
}
});