【发布时间】:2012-02-14 10:11:13
【问题描述】:
Richfaces 3.3.3,Jsf 1.2:
我有一个a4j:form,它使用一些简单的验证,主要是required="true",以确保在没有一些必要数据的情况下不会提交表单。
我还有一些复杂的数据要(可选地)添加到表单中,所以我认为最好的方法是使用a4j:commandButton 来显示rich:modalPanel,用户可以在其中创建复杂的数据集。
创建的数据也会显示在h:selectManyListbox 中,当modalPanel 关闭时会重新渲染。
至少是这样的计划。我有以下问题:
- reRender 有效,但前提是我阻止通过
immediate="true"进行验证 - 这反过来似乎阻止了从 modalPanel 中选择的数据出现在支持 Bean 中 - 如果我删除立即标记,数据会更新,但前提是没有验证错误
让这个以我想要的方式工作的最佳方法是什么?还有其他更好的方法吗?
更新:
验证失败是在表单的某个不同部分,而不是在通过 modalPanel 输入的数据中,后者显示在 Listbox 中
代码:
模态面板:
<rich:modalPanel id="addTrimming" domElementAttachment="parent" width="150" height="130">
<f:facet name="header">
<h:panelGroup>
<h:outputText value="Define Filter" />
</h:panelGroup>
</f:facet>
<f:facet name="controls">
<h:panelGroup>
<h:graphicImage value="/images/close.gif" styleClass="hidelink" id="hidelinkAddTrimming"/>
<rich:componentControl for="addTrimming" attachTo="hidelinkAddTrimming" operation="hide" event="onclick"/>
</h:panelGroup>
</f:facet>
<h:panelGrid id="trimsettings" columns="3">
<h:outputText value="Target:" style="font-weight:bold"/>
<h:inputText id="target" label="XML Filename" required="true" value="#{xmlCreator.trimTarget}">
</h:inputText>
<h:outputText value=""/>
<h:outputText value="Mode:"/>
<h:selectOneMenu value="#{xmlCreator.trimMode}">
<f:selectItem itemLabel="Quality" itemValue="quality"/>
<f:selectItem itemLabel="after Primer" itemValue="afterPrimer"/>
<f:selectItem itemLabel="fixed" itemValue="fixed"/>
<f:selectItem itemLabel="Median length" itemValue="median"/>
<f:selectItem itemLabel="Motif" itemValue="motif"/>
</h:selectOneMenu>
<h:outputText value=""/>
</h:panelGrid>
<h:panelGroup>
<a4j:commandButton value="OK" action="#{xmlCreator.createTrimming}" onclick="from:submit()">
<a4j:support event="oncomplete" ajaxSingle="true" immediate="true" reRender="trimsPanel"/>
</a4j:commandButton>
</h:panelGroup>
</rich:modalPanel>
相关表格部分:
<h:outputText value="Trimming:"/>
<a4j:outputPanel id="trimsPanel">
<h:selectManyListbox id="trims" value="#{xmlCreator.selectedTrimmings}">
<f:selectItems value="#{si:toSelectTrimmingList(xmlCreator.trimmings)}"/>
</h:selectManyListbox>
</a4j:outputPanel>
<a4j:commandButton id="addTrimButton" immediate="true" value=" + Trimming">
<rich:componentControl for="addTrimming" attachTo="addTrimButton" operation="show" event="onclick"/>
</a4j:commandButton>
【问题讨论】:
-
为什么要在列表框中显示不正确的数据?
-
列表框中的数据不正确。其他部分验证失败,列表框只是表单的一部分。
-
所以把它分成不同的形式。