为什么p:对话框没有向bean提交值

时间:2013-02-14 07:31:18

标签: ajax forms jsf-2 primefaces

我有一个小的jsf / primefaces应用程序,带有显示(订购)项目的datgrid。 现在我想在对话框中添加项目。

  1. 点击按钮打开对话框。 - 作品
  2. 我想将对话框中的值提交给bean并更新datagrid。 如果我使用默认值(不是来自对话框)它可以工作。项目将显示在数据网格中,对话框将关闭。这意味着。 -addItem函数有效 -update作品
  3. 但是如果我想从对话框中添加值,我会得到一个空指针异常。所以我的值不会在bean中设置。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <ui:composition xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui">
        <p:fieldset legend="Positionen" toggleable="true" toggleSpeed="500" styleClass="mbsFieldSet">
            <h:form id="form_positions">
    
            <p:growl id="messages" showDetail="true" /> 
            <!-- Add position mask -->
    
            <!-- Button to open the open position mask -->
            <p:commandButton id="btOpenAddPositionMask" value="Position via Dialog" onclick="dlg.show();">
            </p:commandButton>
    
            <p:dataTable var="banfPosition" value="#{banfPositionBean.lsBanfPositions}"
                id="tableBanfPositions" editable="true" >
                <f:facet name="header">Positionen</f:facet>
    
                <!-- AJAX Events for editing position values -->
                <p:ajax event="rowEdit" listener="#{banfPositionBean.onEdit}"
                    update=":form_positions:messages"/>
    
                <p:ajax event="rowEditCancel" listener="#{banfPositionBean.onCancel}"
                    update=":form_positions:tableBanfPositions"  />
    
    
                <p:column headerText="Menge" style="width:50px">
                    <p:cellEditor>
                        <f:facet name="output">
                            <h:outputText value="#{banfPosition.amount}" />
                        </f:facet>
                        <f:facet name="input">
                            <p:inputText value="#{banfPosition.amount}" style="width:100%" />
                        </f:facet>
                    </p:cellEditor>
                </p:column>
    
                <p:column headerText="Matr. / Lager-Nr." style="width:125px">
                    <p:cellEditor>
                        <f:facet name="output">
                            <h:outputText value="#{banfPosition.stockNumber}" />
                        </f:facet>
                        <f:facet name="input">
                            <p:inputText value="#{banfPosition.stockNumber}" style="width:100%" />
                        </f:facet>
                    </p:cellEditor>
                </p:column>
                <p:column headerText="Artikel" style="width:125px">
                    <p:cellEditor>
                        <f:facet name="output">
                            <h:outputText value="#{banfPosition.article}" />
                        </f:facet>
                        <f:facet name="input">
                            <p:inputText value="#{banfPosition.article}" style="width:100%" />
                        </f:facet>
                    </p:cellEditor>
                </p:column>
    
    
                <p:column headerText="Preis/Einheit" style="width:125px">
                    <p:cellEditor>
                        <f:facet name="output">
                            <h:outputText value="#{banfPosition.price}" />
                        </f:facet>
                        <f:facet name="input">
                            <p:inputText value="#{banfPosition.price}" style="width:100%" />
                        </f:facet>
                    </p:cellEditor>
                </p:column>
                <p:column headerText="Gesamtpreis" style="width:125px">
                    <p:cellEditor>
                        <f:facet name="output">
                            <h:outputText value="#{banfPosition.sum}" />
                        </f:facet>
                        <f:facet name="input">
                            <p:inputText value="#{banfPosition.sum}" style="width:100%" />
                        </f:facet>
                    </p:cellEditor>
                </p:column>
                <p:column headerText="Etat-Nr" style="width:125px">
                    <p:cellEditor>
                        <f:facet name="output">
                            <h:outputText value="#{banfPosition.etat}" />
                        </f:facet>
                        <f:facet name="input">
                            <p:inputText value="#{banfPosition.etat}" style="width:100%" />
                        </f:facet>
                    </p:cellEditor>
                </p:column>
                <p:column headerText="Anlagen-Nr" style="width:125px">
                    <p:cellEditor>
                        <f:facet name="output">
                            <h:outputText value="#{banfPosition.complex}" />
                        </f:facet>
                        <f:facet name="input">
                            <p:inputText value="#{banfPosition.complex}" style="width:100%" />
                        </f:facet>
                    </p:cellEditor>
                </p:column>
    
                <p:column headerText="Ändern" style="width:20px; text-align:center">
                    <p:rowEditor />
                </p:column>
                <p:column headerText="Löschen" style="width:20px; text-align:center" >
                    <p:commandButton id="deletePos" actionListener="#{banfPositionBean.deletePos(banfPosition)}" 
                     update=":form_positions:tableBanfPositions" ajax="true" icon="ui-icon ui-icon-close" iconPos="center"
                    title="Löscht den Eintrag in dieser Zeile." />
                </p:column>
            </p:dataTable>
    
    
            </h:form>
        </p:fieldset>
    
        <p:dialog header="Neue Position hinzufügen" widgetVar="dlg"
            resizable="false">
            <h:panelGrid columns="2" style="margin-bottom:10px">
    
                    <h:outputLabel value="Artikel:" />
                    <p:selectOneMenu id="selectArticleForPosition"
                        value="#{banfPositionBean.selectedArticle}" var="art"
                        panelStyle="width:150px" style="width:260px" effect="fade"
                        filterMatchMode="starts" filter="true">
                        <f:selectItems value="#{dataBean.lsArticle}" var="article"
                            itemLabel="#{article.name}" itemValue="#{article}" />
                        <p:column>
                    #{art.id} - #{art.name}
                </p:column>
                    </p:selectOneMenu>
                </h:panelGrid>
    
                <p:commandButton id="btAddPosition" value="Position einfügen"
                    actionListener="#{banfPositionBean.addPos()}"
                    update=":form_positions:tableBanfPositions" oncomplete="dlg.hide();"
                    ajax="true" process="@all" type="submit">
                </p:commandButton>
    
        </p:dialog>
    </ui:composition>
    

    我尝试使用h:form-Tag,因为它显示在http://www.primefaces.org/showcase/ui/dialogForm.jsf但是如果我添加它。

    <p:dialog header="Neue Position hinzufügen" widgetVar="dlg"
            resizable="false">
            <h:form id="form_dialog">
            <h:panelGrid columns="2" style="margin-bottom:10px">
    
                    <h:outputLabel value="Artikel:" />
                    <p:selectOneMenu id="selectArticleForPosition"
                        value="#{banfPositionBean.selectedArticle}" var="art"
                        panelStyle="width:150px" style="width:260px" effect="fade"
                        filterMatchMode="starts" filter="true">
                        <f:selectItems value="#{dataBean.lsArticle}" var="article"
                            itemLabel="#{article.name}" itemValue="#{article}" />
                        <p:column>
                    #{art.id} - #{art.name}
                </p:column>
                    </p:selectOneMenu>
                </h:panelGrid>
    
                <p:commandButton id="btAddPosition" value="Position einfügen"
                    actionListener="#{banfPositionBean.addPos()}"
                    update=":form_positions:tableBanfPositions" oncomplete="dlg.hide();"
                    ajax="true" process="@all" type="submit">
                </p:commandButton>
                </h:form>
        </p:dialog>
    

    页面重新加载但我的bean也不会被调用。

    有谁知道我做错了什么? 谢谢你的帮助。

    ------------------------------------------- < /强> * 修改 * 的 -------------------------------------------

    我尝试使用p:inputText而不是selectOneMenu来调用bean。

    <p:dialog header="Neue Position hinzufügen" widgetVar="dlg"
            resizable="false" appendToBody="true">
            <h:form id="form_dialog">
            <h:panelGrid columns="2" style="margin-bottom:10px">
                    <h:outputLabel for="inputTxt" value="Artikel:" />
                    <p:inputText id="inputTxt" value="#{banfPositionBean.testStr}"></p:inputText>
                </h:panelGrid>
    
                <p:commandButton id="btAddPosition" value="Position einfügen"
                    actionListener="#{banfPositionBean.addPos()}"
                    update=":form_positions:tableBanfPositions" oncomplete="dlg.hide();">
                </p:commandButton>
            </h:form>
        </p:dialog>
    

    所以我只需要找出为什么它不适用于selectOneMenu。

1 个答案:

答案 0 :(得分:0)

首先,我不知道什么是属性类型selectedArticle,我猜它与article(在itemValue)属性中的类型相同。您应该定义转换器,或者另一方面,您应该将value的{​​{1}}绑定为与selectOneMenu相同的类型,并将article.id设置为itemValue。< / p>