1

我对 JSF 很陌生,遇到了一个奇怪的问题,不知道如何解决。

我在一个屏幕中有多个选项卡,在一个选项卡中我有文本字段、下拉列表等。所有文本字段和下拉列表都设置了required="true"

由于此验证,当我尝试导航到另一个选项卡而不输入或选择值时,我无法导航并显示验证消息(需要值)。

但是我在选项卡中有一个保存按钮,验证应该仅在我单击保存按钮时触发,而不是在选项卡切换/导航期间触发。在我单击保存按钮时的验证工作之间,我想要的只是当我切换到不同的选项卡时不应该触发验证。

此验证不允许我切换到不同的选项卡,并且不确定为什么在切换选项卡时会触发此验证。

任何人都可以为我的问题提出一个解决方案。


更新:这是我根据 CycDemo 的回答所做的更改:

<h:tab name="First Tab" accessKey="s">
    <h:panelGroup >
    <h:dataTable id="firstTable" styleClass="dataTableEx" headerClass="headerClass"
                footerClass="footerClass" rowClasses="rowClass1,rowClass2"
                columnClasses="columnClass1" value="#{clientProductCRUDBean.model}"
                var="item" border="1"  cellpadding="2" cellspacing="0" >

                <!-- this for the incoming originator type dropdown field -->

                <h:column>
                    <f:facet name="header">
                        <h:outputText value="firstDropDown" />
                    </f:facet>
                     <h:selectOneMenu id="firstDropDown"  
                                required="true" requiredMessage="required field" immediate="true" >
                            <f:selectItem itemLabel="--Select--" itemValue="#{null}" />
                            <h:message for="firstDropDown" errorClass="generalErrorText"/>
                    </h:selectOneMenu>  
                </h:column>                                 


                <!-- this for the outgoing originator text field -->

                <h:column >
                    <f:facet name="header">
                        <h:outputText value="firstTextField"/>
                    </f:facet>
                    <h:inputText id="firstTextField"
                    required="true" validatorMessage="Max Length 20" requiredMessage="required field" immediate="true" >
                    <f:validateLength maximum="20"/>
                    <h:message for="firstTextField" errorClass="generalErrorText"/>
                    </h:inputText>
                </h:column>

            <!-- this for the replace or randomise radio buttons text field -->

                    <!-- this for the operators selection drop down-->

                </h:dataTable>
    </h:panelGroup>

    <h:panelGroup style="padding: 1px;  margin-top: 5px;" >
                <h:commandButton id="firstSaveButton" styleClass="commandButton"  value="Save" />
                <h:commandButton id="firstSaveCancel" styleClass="commandButton" value="Cancel" immediate="true"/>
    </h:panelGroup>
    <br />
</h:tab>

它仍然调用验证。

4

2 回答 2

3

如果您想switch/navigation不进行验证过程,则必须immediate="true"在您的操作组件中使用。

比方说,你有如下。

<h:commandButton value="Save" />
<h:commandButton value="NextPage" immediate="true"/>

当您单击Save按钮时,验证过程将起作用。但是,NextPage点击验证过程将被克服。

注意 如果有immediate="true"输入组件,即使单击NextPage按钮,也会对该组件执行验证过程。

例子

<h:inputText id="name" value="#{...}" immediate="true" required="true">
<h:commandButton value="Save" />
<h:commandButton value="NextPage" immediate="true"/>

如果单击NextPage按钮,<h:inputText id="name"...>将执行验证过程。你可能有一个问题。为什么他们这样做?答案是你必须学习JSF Life Cycle

于 2012-11-01T10:55:04.207 回答
0

使用 a<rich:tabPanel并将其更改switchType为客户端。然后<rich:tab>在里面使用 s 。

<rich:tabPanel switchType="client">
      <rich:tab>
            ......
      </rich:tab>
</rich:tabPanel>

于 2012-11-01T15:45:06.310 回答