渲染不适用于a4j:outputPanel

时间:2013-08-23 08:02:37

标签: jsf richfaces

我设计了一个jsf页面,我的场景是基于改变selectonemenu中的dopdown来渲染输出面板。我的问题是输入文本框中的required=true。它dosnt允许其他组件呈现,当我在文本框中给出值时,它允许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>

1 个答案:

答案 0 :(得分:2)

问题是,验证失败了。这会导致JSF中断其生命周期并从验证直接跳转到渲染,而不会改变它们之间的任何内容。

我不知道您何时设置DataBean.kabalSectionBean.sendTypeIntEnabled,但您可以检查此值是否会设置为true,因此您的面板不会更改。

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

如果您使用execute="@none",则其效果与immediate="true"相同。