我有
<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);
但我会在最坏的情况下可能.
这是JSF自动包含的jsf.js库中处理ajax响应的已知问题.另见
JSF spec issue 790在即将到来的JSF 2.3中是固定的.同时,使用JSF 2.0 / 2.1 / 2.2,您必须明确指定其他< h:form>的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响应中的任何开销或标记重复.或者,使用OmniFaces fixviewstate.js
.
也可以看看:
> Communication in JSF 2.0 – Ajax rendering of content which contains another form
> h:commandButton/h:commandLink does not work on first click,works only on second click