提交表单时,页面刷新,检票口中的 PageParameters 为空

Posted

技术标签:

【中文标题】提交表单时,页面刷新,检票口中的 PageParameters 为空【英文标题】:Onsubmit of form, page get refreshed and PageParameters gets empty in wicket 【发布时间】:2020-02-16 07:46:02 【问题描述】:

在 LoginPage.java 中,我添加了一些 PageParameters 并将用户重定向到另一个页面。

PageParameters parameters = new PageParameters();
parameters.add("firstName", firstNameValue);
parameters.add("lastName", lastNameValue);
parameters.add("emailAddress", emailAddressValue);

throw new RedirectToPageException(UserInformationPage.class, parameters);

在 AdditionalInformationPage.java 中

public class UserInformationPage extends BaseWebPage 
    private static final long serialVersionUID = 3614392599102678526L;

    public UserInformationPage(final PageParameters parameters) 
        super(parameters);
        setOutputMarkupId(true);

        String firstName, lastName, emailAddress;

        firstName = parameters.get("firstName").toOptionalString();
        lastName = parameters.get("lastName").toOptionalString();
        emailAddress = parameters.get("emailAddress").toOptionalString();

        WebMarkupContainer userInformationPageWrapper = new WebMarkupContainer("userInformationPageWrapper");
        userInformationPageWrapper.add(new UserInformationPanel("userInformationPageContent", firstName, lastName, emailAddress));
        add(userInformationPageWrapper.setMarkupId("userInformationPageWrapper"));
    

用户信息面板.java

public class UserInformationPanel extends Panel 
    private static final long serialVersionUID = -1016518626600751985L;

    public UserInformationPanel(String id, String idpUuid, firstName, lastName, emailAddress) 
        super(id);
        setOutputMarkupId(true);

        Form<Void> userInformationForm = new CSRFSafeForm<Void>("userInformationForm") 
            private static final long serialVersionUID = 2633350725131958527L;

            @Override
            protected void onConfigure() 
                super.onConfigure();
                setVisible(true);
            
        ;

        FeedbackPanel errorFeedbackPanel = new TrackedFeedbackPanel("errorFeedback", new ErrorLevelFeedbackMessageFilter(FeedbackMessage.ERROR));
        errorFeedbackPanel.setMaxMessages(MAX_ERROR_MESSAGES);
        userInformationForm.add(errorFeedbackPanel.setOutputMarkupId(true));

        TextField<String> firstName = new TextField<>("firstName", firstName);
        firstName.add(StringValidator.maximumLength(DatabaseConstants.User.FIRST_NAME_MAX_LENGTH));
        userInformationForm.add(firstName.setRequired(true).setEnabled(true));

        TextField<String> lastName = new TextField<>("lastName", lastName));
        lastName.add(StringValidator.maximumLength(DatabaseConstants.User.LAST_NAME_MAX_LENGTH));
        userInformationForm.add(lastName.setRequired(true).setEnabled(true));

        EmailAddressValidator emailAddressValidator = EmailAddressValidator.getInstance();
        TextField<String> emailAddress = new EmailTextField("emailAddress", emailAddress), emailAddressValidator);
        emailAddress.setRequired(false)
                .add(UniqueEmailValidator.getInstance(UniqueEmailValidator.ErrorMsgType.REGISTER))
                .add(StringValidator.maximumLength(DatabaseConstants.EMAIL_ADDRESS_MAX_LENGTH));
        emailAddress.setEnabled(false);
        userInformationForm.add(emailAddress);

        userInformationForm.add(new AjaxButton("submitButton") 
            private static final long serialVersionUID = -1723378347103997463L;

            @Override
            public void onSubmit(AjaxRequestTarget target, Form<?> form) 
                super.onSubmit(target, form);
                Map<String, Object> userAttributes = new LinkedHashMap<>();
                userAttributes.put("email_Address", emailAddress);
                userAttributes.put("first_Name", firstName);
                userAttributes.put("last_Name", lastName);
                // logic to save userAttributes in DB.
                throw new RedirectToUrlException("/home");
            

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) 
                super.onError(target, form);
                target.add(errorFeedbackPanel);
            
        );
        userInformationForm.setOutputMarkupId(true);
        add(userInformationForm);
    


html 文件中的按钮如下:

<button wicket:id="submitButton" type="submit" class="adb-button__primary nextStep">
                    <span><wicket:message key="Submit"/></span>
                </button>

第一次页面被成功渲染。字段已预先填充。当我第一次单击提交按钮时,页面被刷新并且页面参数为空。表单再次呈现,但值为空。在第二次单击时,它可以正常工作。

那么,如何停止页面刷新,以使 pageParams 不会为空,并且在第一次单击提交按钮时,它会验证表单并在页面上显示错误(如果有)?

【问题讨论】:

您好,您能解释一下变量 userAttributes 的用途吗?我看到您在 submitButton#onSubmit 中定义并初始化它,但它似乎没有在其他任何地方使用。 在重定向到主页之前,我必须保存 userAttributes。我已经更新了代码。 如果您使用标准表单而不是 CSRFSafeForm 是否有效? CRSFSafeForm 内部扩展表单。 【参考方案1】:

我无法添加评论,所以我建议这个答案。

请在onSubmit() 方法中检查这一行:throw new RedirectToUrlException("/home");。你为什么用它?这意味着每当用户提交表单时,您都会重定向到 /home,并且可能在家中重定向回 LoginPage。请检查 /home 路线发生的情况,或发布更多信息,以便我可以更好地帮助您。

【讨论】:

以上是关于提交表单时,页面刷新,检票口中的 PageParameters 为空的主要内容,如果未能解决你的问题,请参考以下文章

提交时停止表单刷新页面

刷新页面时如何防止表单重新提交(F5 / CTRL+R)

提交表单后正确刷新页面

ajax中的表单提交而不刷新整个页面只刷新ATG中的特定div标签

当表单提交和刷新我的加载屏幕的页面再次出现时?

在用php做小页面,有个表单.每次刷新页面时老是提示不要重复提交表单?怎样去掉这个提示啊