0

我设计了一个 jsf 页面,我的场景是基于更改 selectonemenu 中的下拉菜单来呈现输出面板。我的问题在required=true输入文本框中。它不允许其他组件渲染,当我在文本框中给出值时,它允许selectonemenu渲染。我做错了什么。请有人解决我的问题

代码

<a4j:outputPanel id="thapalSection" >
    <ui:fragment>
        <fieldset style="table-layout: fixed;">
            <legend>#{msg.lbl_post_offSect}</legend>
            <table border="0" cellpadding="1" cellspacing="15" width="100%" 
                style="border-width: 1px;border-spacing: 1px;border-style: solid;border-color:#c2c2c2">
                <tr>
                    <td align="left"  width="20%">#{msg.lbl_SenDTo}<span>
                        <font color="red"><b>*</b></font></span>
                    </td>
                    <td align="left"  colspan="3"  width="30%">
                        <a4j:outputPanel id="tapalSectionSendToPanel">
                            <h:inputText id="sendToId"  value="#{DataBean.kabalSectionBean.sendTo}"  class="createresizedTextbox"
                                readonly="true" required="true" requiredMessage="#{msg.labl_required}" />
                            <h:message for="sendToId" style="color:red" />
                        </a4j:outputPanel>
                    </td>
                </tr>
                <tr>
                    <td align="left"  width="20%" >#{msg.lbl_lettRef}</td>
                    <td align="left"  width="34%" >
                        <a4j:outputPanel id="letterReferenceIDPAnel">
                            <h:inputText id="lettRefId" value="#{DataBean.kabalSectionBean.letterFileRefNo}" 
                                class="createresizedTextbox"  required="true" requiredMessage="#{msg.labl_required}" immediate="true"/>
                            <h:message  for="lettRefId" style="color:red" />
                        </a4j:outputPanel>
                    </td>
                </tr>
                <tr>
                    <td>#{msg.lbl_Sender_type}</td>
                    <td>
                        <a4j:outputPanel id="senderTypePanel" >
                            <h:selectOneMenu value="#{DataBean.kabalSectionBean.senderType}" class="createresizedTextbox"  id="senderTypeID">
                                <a4j:ajax event="change" render="thapalSection internalPanel" listener="#{FileTrackAction.selectSenderType}"  />
                                <f:selectItem itemValue="--select--" itemLabel="--Select--" />
                                <f:selectItem itemValue="internal" itemLabel="Internal" />
                                <f:selectItem itemValue="external" itemLabel="External" />
                                <f:validator validatorId="org.gov.tnwrd.bean.validation.DropdownValidation" />
                            </h:selectOneMenu>
                            <h:message for="senderTypeID" style="color:red" />
                        </a4j:outputPanel>
                    </td>
                </tr>
                <a4j:outputPanel id="internalPanel" >
                    <ui:fragment  rendered="#{DataBean.kabalSectionBean.sendTypeIntEnabled==true}" >
                        <tr>
                            <td align="left"  width="20%" >#{msg.lbl_office_name}</td>
                            <td align="left" width="34%">
                                <h:inputText id="internalType" value="#{DataBean.kabalSectionBean.officeName}" class="createresizedTextbox"  readonly="true" />
                            </td>
                            <td align="left" width="17%"  >#{msg.lbl_type_letter}</td>
                            <td align="left">
                                <h:selectOneMenu class="createresizedTextbox" value="#{DataBean.kabalSectionBean.typeOfletter}">
                                    <f:selectItem itemValue="--" itemLabel="--Select--" />
                                    <f:selectItem itemValue="ordinaryLetter" itemLabel="Ordinary Letter" />
                                    <f:selectItem itemValue="doLetter" itemLabel="D.O Letter" />
                                    <f:selectItem itemValue="confidentialLetter" itemLabel="Confidential Letter" />
                                    <f:selectItem itemValue="OtherLetter" itemLabel="Other Letter" />
                                </h:selectOneMenu>
                            </td>
                        </tr>
                    </ui:fragment>
                </a4j:outputPanel>
            </table>
        </fieldset>
    </ui:fragment>
</a4j:outputPanel>
</td>
</tr>
</table>
</td>
</tr> 
</table>
<table cellspacing="1" cellpadding="15" width="100%" border="0">
    <tr>
        <td></td>
        <td colspan="6" align="right">
            <div class="buttons">
                <a4j:commandButton id="addThapal" value="#{msg.btn_send}" type="button" render="thapalPanel savePopUp" action="#{FileTrackAction.saveThapalDetails}" oncomplete="if(#{DataBean.kabalSectionBean.statusCode eq 'Success'})  #{rich:component('savePopUp')}.show();"/>
                <a4j:commandButton id="clearId" value="#{msg.btn_clear}" render="thapalPanel" action="#{FileTrackAction.clearTapalSection}"  type="button" />
            </div>
        </td>
    </tr>
</table>
</a4j:outputPanel>
4

1 回答 1

2

问题是,验证失败。这会导致 JSF 中断其生命周期并从验证直接跳转到渲染,而不会在两者之间进行任何更改。

我不知道你什么时候设置DataBean.kabalSectionBean.sendTypeIntEnabled,但你可以检查这个值不会被设置true,因此你的面板不会改变。

你在这里有不同的选择。您可以使用该immediate="true"属性跳过验证,也可以使用execute="list of components you want to execute". 执行意味着,数据将被发送到支持 bean,将被验证并setXXX(...)为此输入调用方法。在这里您不会列出必填字段,因此其验证不会成为问题。

如果你使用execute="@none"它有同样的效果immediate="true"

于 2013-08-23T08:24:30.853 回答