我正在使用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 />
<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 />
<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不工作?
答案 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结尾。