选项卡中的PrimeFaces按钮不导航

时间:2011-01-26 22:28:55

标签: jsf jsf-2 primefaces

我正在使用JSF 2.0,NetBeans 6.9.1,GlassFish 3.1,Mojarra 2.0.3和PrimeFaces 2.2-RC2开发此项目。

我的问题类似于this question,但即使我能够让我的一个按钮工作,另一个却没有。这是我的情况:我有一个dataTable,其中一列包含两个链接,一个用于编辑行数据,一个用于查看行数据。点击“修改”或“查看”链接可转到<h:panelGrid>组件中包含<p:tabView>个组件的详细信息页面。我的详细信息页面有两个<p:tabView>组件,一个用于编辑,一个用于查看数据。您看到哪一个取决于<c:if>语句。页面上第一个<p:tabView>中的按钮(我的意思是首先从顶部向下工作)按照我的意愿工作,这恰好是“编辑”组件。另一个<p:tabView>中的按钮不起作用。我设置了断点并通过调试器,第二个按钮似乎不会触发ActionEvent,无论我尝试什么。这是我的页面代码:

            <ui:define name="metadata">
                <f:metadata>
                    <f:viewParam name="id" value="#{userDetailBean.selectedUserId}" />
                    <f:viewParam name="action" value="#{userDetailBean.view}" />
                </f:metadata>


            </ui:define>


            <ui:define name="main_base_content_top">
                <h:form>
                    <p:toolbar>
                        <p:toolbarGroup align="left">
                            <h:commandButton value="Return to User List" action="user_grid" />
                        </p:toolbarGroup>
                    </p:toolbar>
                </h:form>
            </ui:define>

            <ui:define name="main_base_content">

                    <c:if test="#{empty userDetailBean.view}">
                        <h:form>
                        <table align="center">
                            <tr>
                                <td>
                                    <p:tabView>
                                        <p:tab title="#{msgs.UserDetailTabTitle}">
                                            <h:panelGrid columns="4">
                                                <h:outputLabel value="#{msgs.UserDetailFirstName}" for="fname" />
                                                <h:inputText id="fname" value="#{userDetailBean.firstName}" />
                                                <h:outputLabel value="#{msgs.UserDetailJobTitle}" for="jtitle" />
                                                <h:inputText id="jtitle" value="#{userDetailBean.jobTitle}" />
                                                <h:outputLabel value="#{msgs.UserDetailLastName}" for="lname" />
                                                <h:inputText id="lname" value="#{userDetailBean.lastName}" />
                                                <h:outputLabel value="#{msgs.UserDetailEmployeeId}" for="empid" />
                                                <h:inputText id="empid" value="#{userDetailBean.id}" />
                                                <h:outputLabel value="#{msgs.UserDetailDateOfHire}" for="doh" />
                                                <h:inputText id="doh" value="#{userDetailBean.DOH}" />
                                                <h:outputLabel value="#{msgs.UserDetailLocation}" for="location" />
                                                <h:inputText id="location" value="#{userDetailBean.location}" />
                                                <h:outputLabel value="#{msgs.UserDetailStatus}" for="status" />
                                                <h:inputText id="status" value="#{userDetailBean.status}" />
                                                <h:inputHidden /> <h:inputHidden /> <h:inputHidden /> <h:inputHidden /> <h:inputHidden />
                                                &nbsp;
                                                <h:outputLabel value="#{msgs.UserDetailComments}" for="comments" />
                                                <h:inputTextarea id="comments" value="#{userDetailBean.comments}" />
                                                <h:inputHidden />
                                                <p:commandButton ajax="false" action="#{userDetailBean.submitChanges()}" value="Submit Changes" />
                                            </h:panelGrid>
                                        </p:tab>
                                    </p:tabView>
                                </td>
                            </tr>

                        </table>
                        </h:form>
                    </c:if>
                    <c:if test="#{! empty userDetailBean.view}">
                        <h:form>
                        <table align="center">
                            <tr>
                                <td>
                                    <p:tabView>
                                        <p:tab title="#{msgs.UserDetailViewTabTitle}">
                                            <h:panelGrid columns="4">
                                                <h:outputLabel value="#{msgs.UserDetailFirstName}" for="fname" />
                                                <h:outputText id="fname" value="#{userGridBean.selectedUser.firstName}" />
                                                <h:outputLabel value="#{msgs.UserDetailJobTitle}" for="jtitle" />
                                                <h:outputText id="jtitle" value="#{userGridBean.selectedUser.jobTitle}" />
                                                <h:outputLabel value="#{msgs.UserDetailLastName}" for="lname" />
                                                <h:outputText id="lname" value="#{userGridBean.selectedUser.lastName}" />
                                                <h:outputLabel value="#{msgs.UserDetailEmployeeId}" for="empid" />
                                                <h:outputText id="empid" value="#{userGridBean.selectedUser.id}" />
                                                <h:outputLabel value="#{msgs.UserDetailDateOfHire}" for="doh" />
                                                <h:outputText id="doh" value="#{userGridBean.selectedUser.DOH}" />
                                                <h:outputLabel value="#{msgs.UserDetailLocation}" for="location" />
                                                <h:outputText id="location" value="#{userGridBean.selectedUser.location}" />
                                                <h:outputLabel value="#{msgs.UserDetailStatus}" for="status" />
                                                <h:outputText id="status" value="#{userGridBean.selectedUser.status}" />
                                                <h:inputHidden /> <h:inputHidden /> <h:inputHidden /> <h:inputHidden /> <h:inputHidden />
                                                &nbsp;
                                                <h:outputLabel value="#{msgs.UserDetailComments}" for="comments" />
                                                <h:outputText id="comments" value="#{userGridBean.selectedUser.comments}" />
                                                <h:inputHidden /> <h:inputHidden /> <h:inputHidden />
                                                <p:commandButton onclick="submit()" ajax="false" action="#{userDetailBean.navigation()}" value="Retur to User Grid" />
                                            </h:panelGrid>
                                        </p:tab>
                                    </p:tabView>
                                </td>
                            </tr>
                        </table>
                        </h:form>
                    </c:if>                 

            </ui:define>
        </ui:composition>        
    </body>

我已经尝试了第二个按钮我能想到的一切:ajax =“false”;的onclick = “提交()”; ajax =“false”onclick =“submit”;我尝试过使用重定向的隐式导航以及带有重定向的导航规则。操作方法userDetailBean.submitChanges()和userDetailBean.navigate()都返回相同的字符串,这对应于faces-config文件中的导航规则。调用submitChanges方法,但我的导航方法没有。我现在没有填充任何数据的字段,我只是想让基本导航工作。为什么第二个tabView上的commandButton不工作?

1 个答案:

答案 0 :(得分:2)

未调用命令按钮的另一个原因是按钮的rendered属性或其父级之一在表单提交的应用请求值阶段评估false

你实际上没有,但那些<c:if>标签做类似的事情,只在视图构建时间而不是视图渲染时间。在构建视图期间不应用视图参数,但仅在此之后应用。这正是#{userDetailBean.view}始终为空的原因。

我从未在<c:if>中使用过这样的构造,但是我有类似的视图,这个视图只适用于@ViewScoped bean,其中呈现属性应用于一个值得尊重的JSF组件而不是<c:if>

作为第一步,摆脱<c:if>并将他们的测试移到他们正在包装的rendered的{​​{1}}属性中:

<h:form>

如果徒劳(我猜这会失败,因为你没有使用ajax而且viewparams没有保留)并且bean确实是<h:form rendered="#{empty userDetailBean.view}"> ... </h:form> <h:form rendered="#{not empty userDetailBean.view}"> ... </h:form> ,那么你需要将它标记为@RequestScoped保留渲染条件。

相关问题:


与问题无关,我宁愿使用@ViewScoped代替<h:panelGroup />来“填充”表格的空单元格。它们编码和解码成本更低,并且以更好的HTML结尾。