通过ajax呈现其他表单会导致其视图状态丢失,如何将其添加回?

通过ajax呈现其他表单会导致其视图状态丢失,如何将其添加回?,ajax,forms,jsf,jsf-2,viewstate,Ajax,Forms,Jsf,Jsf 2,Viewstate,我有 当我点击一次“my_fake_ajax_链接”时,我必须点击两次“delete”链接。这只是一个例子。我没有这个真正的案子。我在一个页面上有多个表单,我不能只在一个表单中添加所有表单 我检查了问题是什么,它是: 当您单击“my_fake_ajax_链接”时,mydiv将以ajax刷新 ajax上刷新表单的ViewState丢失 如何添加ViewState?如果不使用一个表单,如何使其工作?对我来说,这看起来像一个JSF bug。我不想使用自动刷新该div jQuery("#mydi

我有


当我点击一次“my_fake_ajax_链接”时,我必须点击两次“delete”链接。这只是一个例子。我没有这个真正的案子。我在一个页面上有多个表单,我不能只在一个表单中添加所有表单

我检查了问题是什么,它是:

  • 当您单击“my_fake_ajax_链接”时,
    mydiv
    将以ajax刷新
  • ajax上刷新表单的ViewState丢失
如何添加ViewState?如果不使用一个表单,如何使其工作?对我来说,这看起来像一个JSF bug。我不想使用自动刷新该div

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

但在最坏的情况下,我将尽可能解决这个问题。

这是jsf自动包含的
jsf.js
库中的一个已知问题,该库处理ajax响应。另请参见即将发布的JSF2.3中修复的。同时,使用JSF2.0/2.1/2.2,您必须在
render
attribtue中显式指定另一个
的ID,以触发视图状态的正确添加


不,这不会在ajax响应中造成任何开销或标记重复。或者,使用

另见:
解决方法:

首先,需要为发送ajax请求的按钮设置
onevent
处理程序:

<h:form id="newComment">
    <h:commandButton id="saveNewComment" action="#{postBean.actionSaveNewCommentAjax}" value="#{rb['speichern']}">
        <f:ajax execute="@form" render=":commentsBox" onevent="function(data) { fixOtherFormsViewState(data, 'newComment') }" />
    </h:commandButton>
</h:form>

然后,您需要声明此javascript方法,该方法将采用正确的viewState值,并将其添加到所有没有viewState值的表单中:

<h:outputScript>
function fixOtherFormsViewState(data, goodFormId) {
    if (data.status != "success") {
        return;
    }

    var viewState = jQuery("#" + goodFormId + " input[name='javax.faces.ViewState']").val();
    jQuery("form:not(:contains(input[name='javax.faces.ViewState']))").each(function (idx, elem) {
        var form = jQuery(elem);
        var input = jQuery("&lt;input type='hidden' name='javax.faces.ViewState' /&gt;").val(viewState);
        form.append(input);
    });
}
</h:outputScript>

函数fixOtherFormsViewState(数据,goodFormId){
如果(data.status!=“成功”){
返回;
}
var viewState=jQuery(“#”+goodFormId+”输入[name='javax.faces.viewState']”).val();
jQuery(“form:not(:contains(input[name='javax.faces.ViewState']))))。每个(函数(idx,elem){
var form=jQuery(elem);
var input=jQuery(“input type='hidden'name='javax.faces.ViewState'/”).val(ViewState);
表单。追加(输入);
});
}

非常感谢您!!!我在谷歌上找不到这个链接。。即使经过了长时间的搜索……但遗憾的是,它没有进入JSF2.2。让我们再等一两年再修好吧…@mel:OmniFaces to the rescue: