Primefaces tabView对选项卡更改执行表单验证

时间:2012-12-23 11:19:24

标签: validation jsf-2 primefaces onchange tabview

我遇到了p:tabView组件的严重问题。我已将dynamic="true"cache="false"设置为tabView。其中一个选项卡包含一些设置为required="true"的输入组件。

现在每当我更改标签时,表单验证正在进行,FacesMessages将以growl显示。

这是标签:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:p="http://primefaces.org/ui"
   template="/WEB-INF/templates/globalTemplate.xhtml">

   <ui:define name="title">#{adbBundle['home']}</ui:define>
   <ui:define name="content">
      <p:growl id="growl" showDetail="true" autoUpdate="true" />

      <p:tabView id="adminTabView" dynamic="true" cache="false">
         <p:tab title="#{adbBundle['admin.customerTab.title']}"
            id="customerTab">
            <ui:include src="/WEB-INF/includes/adminCustomer.xhtml" />
         </p:tab>
         <p:tab title="#{adbBundle['admin.activityTab.title']}"
            id="activityTab">
            <ui:include src="/WEB-INF/includes/addActivity.xhtml" />
         </p:tab>
      </p:tabView>

   </ui:define>

</ui:composition>

adminCustomer.xhtml包含表单,其中包含:

<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">

   <h:form id="customerForm">
      <p:panel id="addCustomerPanel" toggleable="true"
         header="#{adbBundle['admin.addCustomerPanel.header.new']}">
         <p:panelGrid columns="2" id="addCustomerTable"
            styleClass="addCustomerTable">
            <f:facet name="header">
               <p:outputLabel id="header"
                  value="#{adbBundle['admin.addCustomerPanel.addCustomerTable.header']}" />
            </f:facet>

            <p:outputLabel for="customerName"
               value="#{adbBundle['admin.addCustomerPanel.addCustomerTable.customerName']}" />
            <h:panelGroup layout="block">
               <p:inputText id="customerName" styleClass="customerName"
                  autocomplete="off"
                  label="#{adbBundle['admin.addCustomerPanel.addCustomerTable.customerName']}"
                  value="#{adminController.customerDTO.customerName}"
                  required="true" />               
            </h:panelGroup>

            <p:outputLabel for="customerId"
               value="#{adbBundle['admin.addCustomerPanel.addCustomerTable.customerId']}" />
            <h:panelGroup layout="block">
               <p:inputText id="customerId" autocomplete="off"
                  label="#{adbBundle['admin.addCustomerPanel.addCustomerTable.customerId']}"
                  value="#{adminController.customerDTO.customerId}" required="true">
                  <f:validator validatorId="customerIDValidator" />
               </p:inputText>               
            </h:panelGroup>

            <p:outputLabel for="activeStatus"
               value="#{adbBundle['admin.addCustomerPanel.addCustomerTable.activeStatus']}" />
            <h:panelGroup layout="block">
               <p:selectBooleanCheckbox id="activeStatus"
                  value="#{adminController.customerDTO.active}" />
            </h:panelGroup>

            <f:facet name="footer">
               <p:commandButton value="#{adbBundle['saveButton']}"
                  actionListener="#{adminController.saveCustomer}"
                  icon="ui-icon-check"
                  update=":growl, @form" />
            </f:facet>
         </p:panelGrid>
      </p:panel>
   </h:form>

</ui:composition>

我无法找到我做错了什么以及如何解决它。 我使用Primefaces 3.4.2和JSF Mojarra 2.1.7-jbossorg。任何指针都对我很有帮助。

我也在PrimeFaces论坛上提出了这个问题。

2 个答案:

答案 0 :(得分:4)

这就是tabView的工作原理。以下是PrimeFaces跟踪器的相关问题:

如您所见,第一个被标记为WontFix。 第二个是重复的,但最后你会看到另一种解决方法

如果您仔细阅读该主题,您可能会注意到仍存在一些变通方法。如果您被迫使用tabView,请尝试其中一个。如果要在不同选项卡中使用输入,也请考虑使用PrimeFaces - Wizard

答案 1 :(得分:0)

如果我正确理解您的问题,实际上有一个非常简单的解决方法可以防止重复显示消息。

将你的咆哮改为:

<p:growl id="growl" globalOnly="true" autoUpdate="true" showDetail="true" />

如果您想要从辅助bean端添加消息,可以使用以下代码执行此操作:

FacesContext.getCurrentInstance()
   .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "title", "details");

如果你想要完全安全,你甚至可以为咆哮指定一个for-attribute,并将其作为addMessage的第一个参数。