小编典典

用ajax渲染其他表单会导致其视图状态丢失,如何将其重新添加?

ajax

我有

<h:form>
    <h:commandLink action="#{my_fake_ajax_link}">
        <h:outputText value="Link" />
        <f:ajax render=":mydiv" />
    </h:commandLink>
</h:form>

<h:panelGroup layout="block" id="mydiv">
    <h:form>
        <h:commandLink action="#{mybean.delete(0)}">
            <h:outputText value="Here" />
            <f:ajax render="@form" />
        </h:commandLink>
    </h:form>
</h:panelGroup>

当我单击“
my_fake_ajax_link”一次时,则必须单击两次“删除”链接。这仅仅是一个例子。我没有这个真实的案例。我在页面上有多种形式,不能仅将所有形式添加为一种形式。

我检查了问题所在,它是:

  • 当您单击“ my_fake_ajax_link”时,mydiv应使用ajax刷新。
  • 在ajax上刷新的窗体的ViewState丢失。

如何添加ViewState?如何仅使用一种表格就可以使其工作?在我看来,这似乎是一个JSF错误。我不想自动刷新该div

jQuery("#mydiv").load(document.location.href);

但在最坏的情况下,我会尽可能。


阅读 246

收藏
2020-07-26

共1个答案

小编典典

这是自动包含jsf.js的JSF库中的一个已知问题,该库处理ajax响应。另请参见即将发布的JSF
2.3中已修复的JSF规范问题790。同时,对于JSF
2.0 / 2.1 / 2.2,您必须<h:form>render属性内显式指定另一个ID,以触​​发适当添加视图状态。

<h:form>
    <h:commandLink action="#{my_fake_ajax_link}">
        <h:outputText value="Link" />
        <f:ajax render=":mydiv :mydivForm" />
    </h:commandLink>
</h:form>

<h:panelGroup layout="block" id="mydiv">
    <h:form id="mydivForm">
        <h:commandLink action="#{mybean.delete(0)}">
            <h:outputText value="Here" />
            <f:ajax render="@form" />
        </h:commandLink>
    </h:form>
</h:panelGroup>

不,这不会在ajax响应中引起任何开销或标记重复。或者,使用OmniFacesfixviewstate.js

2020-07-26