我在理解自己做错事情时遇到了一些问题。

我做的事:


在我的应用程序中覆盖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
    }
});

09-25 22:16