使用primefaces ajax动态包含多个页面提交

时间:2011-12-22 21:43:55

标签: jsf-2 primefaces

我一直在努力解决这个问题,我希望有人可以帮助我。

我有这个代码使用JSF-2(取自BalusC在this question中给出的解决方案):

<h:panelGroup id="content" layout="block">
    <h:form id="contentform">
        <h:panelGroup rendered="#{bean.page == 'include1'}">
            <ui:include src="include1.xhtml" />
        </h:panelGroup>
        <h:panelGroup rendered="#{bean.page == 'include2'}">
            <ui:include src="include2.xhtml" />
        </h:panelGroup>
        <h:panelGroup rendered="#{bean.page == 'include3'}">
            <ui:include src="include3.xhtml" />
        </h:panelGroup>
    </h:form>
</h:panelGroup>  

然后,在包含的每个页面中,我有类似的东西(也在工作):

<h:outputText value="Name: "/>
<h:inputText value="#{itemsBean.item.name}" id="name" required="#{not empty param[save.clientId]}"/>                    

<h:outputText value="Desc: "/>
<h:inputText value="#{itemsBean.item.description}" id="desc" required="#{not empty param[save.clientId]}"/>

<h:commandButton binding="#{save}" label="Save" actionListener="#{itemsBean.save}">
    <f:ajax render=":contentForm" execute="name desc"
</h:commandButton>

<h:dataTable value="#{itemsBean.itemsList}" var="item">
    <h:column>
        <h:outputText value="#{item.name}" />
    </h:column>
    <h:column>
        <h:outputText value="#{item.description}" />
    </h:column>
</h:dataTable>  

现在问题
它开始于我尝试将PrimeFaces用于包含页面时,特别是当我将<h:commandButton...替换为:

<p:commandButton binding="#{save}" value="Save" actionListener="#{itemsBean.save}">
    <p:ajax update=":contentForm" process="name desc" />
</p:commandButton>  

结果是表单被多次提交,甚至来自其他包含(未呈现)页面的输入字段也被处理(完全混乱)。

我正在使用:
JSF 2.1.1 Mojarra实施。
PrimeFaces 3.0-RC2。
Tomcat 7.
(Tomcat和JSF是NetBeans 7.0.1附带的那些)

提前谢谢。

3 个答案:

答案 0 :(得分:1)

p:commandButton上为什么您同时使用bindingactionListener属性?顺便说一下,#{save}是什么?你的意思是#{itemsBeans.save}

无论您是在托管bean的save方法中设置actionListener,也不应该绑定它。删除绑定属性,看看是否可以防止多次回发。

答案 1 :(得分:0)

我必须在每个相应的页面中替换binding="#{save}",例如binding="#{savePage1}"binding="#{savePage2}"binding="#{savePage2}"

我遇到的另一个错误是<p:ajax...,这导致了奇怪的行为。我有这个:

<p:ajax update=":contentForm" process="name desc" />

应该是这样的:

<p:ajax update=":contentForm" process="@this name desc" />

"@this"

似乎并非强制要求<f:ajax execute="..

答案 2 :(得分:0)

默认情况下,primefaces启用了ajax。所以你不需要指定

<p:commandButton value="Save" 
  update="@form"  
  process="@this,name,desc"
     actionListener="#{itemBean.save}" /> 

2)“@ this”是必须的。它必须处理commandButton单击。 3)使用prependId =“false”。这将使您能够将process属性中的控件名称指定为实际控件名称,即name,desc,否则您必须在控件的前面指定表单名称,如 contentFrom:姓名,contentForm:降序

Update = @form表示它将在执行后呈现完整的表单。

希望这能解决问题。