我对 JSF 2 有一个问题。我使用 Mojarra 2.1.14 和 Primefaces 3.1.4
我有一个包含 2 个表单的页面:formA和formB。这两个表单在隐藏的输入字段中分别包含 ViewState。
<h:form id="formA" binding="#{sessionBean.formA}">
<h:commandButton value="formA" action="#{sessionBean.actionA}">
<f:ajax/>
</h:commandButton>
</h:form>
<h:form id="formB" binding="#{sessionBean.formB}">
<h:commandButton value="formB" action="#{sessionBean.actionB}">
<f:ajax/>
</h:commandButton>
</h:form>
用户使用 Ajax 操作提交formA 。在 Java 操作中,我显式更新了formA和formB(已绑定)。
public void actionA(){
FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(formA.getClientId());
FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(formB.getClientId());
System.out.println("action A!!");
}
public void actionB(){
System.out.println("action B!!");
}
在 Ajax 响应中有formA和formB(元素)的 HTML 代码以及 ViewState。
JSF 更新formA和formB的 HTML并设置调用表单的 ViewState:formA。 formB不包含任何 ViewState。
用户使用 Ajax 操作提交formB 。因为未定义 ViewState,所以 postBack 为 false,并且在 RESTORE 阶段将 renderResponse 设置为 true,跳过了 INVOKE APPLICATION 阶段:未调用该操作。更新响应 VIEW_STATE 后,如果用户提交 formB,则调用该操作。
它是 JSF 2 的错误还是限制?还是我做错了什么?
你可以在 GitHub 上找到一个 maven 项目: https ://github.com/nithril/jsf-multiple-form
在此先感谢您的帮助!