如果在使用target=_blank提交表单后再使用ajax,Wicket页面将被刷新。

5

我有一个预览按钮。当用户按下预览按钮时,表单会在新标签页上提交,以显示包含表单数据的PDF文件。 我使用自定义的SubmitResourceLink来实现这一功能。

public abstract class SubmitResourceLink extends SubmitLink implements IResourceListener {
private final IResource resource;

@Override
public final void onResourceRequested() {
    Attributes a = new Attributes(RequestCycle.get().getRequest(), RequestCycle.get().getResponse(), null);
    resource.respond(a);
}

在表单上实现
new SubmitResourceLink("previewBtn", form, new JasperReportsResource() {
        private static final long serialVersionUID = -2596569027102924489L;

        @Override
        public byte[] getData(Attributes attributes) {
            return control.getExportPreviewByteStream(estimateModel.getObject());
        }
    }) {
        private static final long serialVersionUID = 1L;

        @Override
        protected String getTriggerJavaScript() {
            String js = super.getTriggerJavaScript();
            js = "document.getElementById('" + form.getMarkupId() + "').target='_blank';" + js;
            return js;
        }

        @Override
        public void onSubmit() {
            form.add(AttributeModifier.append("target", Model.of("_blank")));
            processInputs(form);
            onResourceRequested();
        }
    }.setDefaultFormProcessing(false);

当我点击预览时,会打开一个新的选项卡。但是当我在任何ajax组件(例如:AutoCompleteTextField)中输入时,ajax响应数据xml:<ajax-response><redirect>....</redirect></ajax-response>并刷新页面。 现在,我希望在点击预览后,仍然可以正常使用当前表单。 谢谢。
1个回答

1
这是由于Wicket中的“陈旧页面保护”引起的。 第一次点击会在新标签页/窗口中打开相同的页面实例。这会增加页面的renderCount计数器,即它表示“该页面已呈现N次”。 Wicket中的链接看起来像?2-1.ILinkListener-component~path。其中'2'是页面ID,'1'是页面呈现计数。因此,tab1中的链接具有renderCount 'N',而tab2中的链接具有'renderCount N + 1'。 在tab1中单击链接将失败,并出现StalePageException,告诉Wicket“用户正在尝试使用过时版本的页面。请呈现最新版本的页面,以便用户可以重试”。
这种保护是必要的,因为用户可能在tab3中执行许多操作,例如替换一个面板,该面板替换/隐藏了用户想要在tab1中单击的链接。如果没有这种保护,Wicket将在尝试单击链接时或者更糟糕的是,如果链接/按钮在重复器中并且重复器在tab2中更改了其项目,则可能会因ComponentNotFoundException而失败。
为了解决您的问题,您应该在tab2中打开一个新的页面实例。也就是说,在提交表单时,在onSubmit()方法中执行类似于setResponsePage(getPage().getClass())的操作。这样做可以避免当前页面实例被重新渲染N+1次。

谢谢回答。我明白为什么Wicket这样做了。但是我不知道如何解决我的问题。 - luanvu
使用弹出窗口是一个选项吗?这比打开一个新标签页要简单得多。应该像这样:SubmitLink#setPopupSettings(...) - martin-g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接