Richfaces 4 数据表中的错误,当数据为空时进行数据滚动验证
Richfaces 4 bug in datatable with datascroller validation when empty
我的 Richfaces 应用程序中有一个屏幕,它使用数据表和数据滚动器,并进行验证以确保数据已填充。
(模拟问题的例子,完整的例子可以找到here
<h:form id="articleForm" >
<h:panelGroup layout="block">
<rich:messages globalOnly="true" />
<rich:dataTable value="#{productModifyBean.articles}" var="article" id="articleTable"
rows="15" >
<rich:column headerClass="headerOverflow artNrColumn">
<f:facet name="header">
<h:outputText value="articleNumber" />
</f:facet>
<h:outputText value="#{article.articleNumber}"/>
</rich:column>
<rich:column headerClass="headerOverflow shortNameColumn">
<f:facet name="header">
<h:outputText value="Name" />
</f:facet>
<h:outputText value="#{article.shortName}" />
</rich:column>
<rich:column headerClass="headerOverflow quantityColumn" >
<f:facet name="header">
<h:outputText value="Quantity" />
</f:facet>
<h:inputText value="#{article.quantity}" required="true"
requiredMessage="This is required" converterMessage="Error conversion"
id="modifyArticleFormatQuantity" >
</h:inputText>
<rich:message for="modifyArticleFormatQuantity" errorClass="errorColorRed" />
</rich:column>
</rich:dataTable>
<rich:dataScroller for="articleTable" renderIfSinglePage="false" boundaryControls="show" fastControls="hide" execute="@form" render="articleTable"
stepControls="show" style="float:right;" />
</h:panelGroup>
<br style="clear: both" />
<br style="clear: both" />
<div align="right" style="clear: both">
<a4j:commandButton value="#{msgs['button.modify'] }" styleClass="submitButton"
render="#{facesContext.validationFailed ? '@none' : 'articleForm'}"
actionListener="#{productModifyBean.modifyProduct}">
</a4j:commandButton>
</div>
</h:form>
数据验证应在用户按下提交按钮(以保存数据)以及用户使用分页转到不同页面时进行。
在将一个字段留空后单击提交按钮时,行为是正常的:它显示一个带有备注 'this is required'
的空字段
然而,当移动到另一个页面时(例如点击“2”页面按钮),验证正确发生,但旧值被放回屏幕,因此说明该值应该被填充但显示它填充了一个值。
任何人都知道这个问题可能是什么原因,以及如何解决它?这是 RichFaces 中的错误,还是我忽略了什么?
我通过反复试验找到了解决方案:
如果我将数据滚动器更改为使用 render="@region" ,屏幕就会正确呈现。
<rich:dataScroller for="articleTable" renderIfSinglePage="false" boundaryControls="show" fastControls="hide" execute="@form" render="articleTable"
stepControls="show" style="float:right;" />
我的 Richfaces 应用程序中有一个屏幕,它使用数据表和数据滚动器,并进行验证以确保数据已填充。 (模拟问题的例子,完整的例子可以找到here
<h:form id="articleForm" >
<h:panelGroup layout="block">
<rich:messages globalOnly="true" />
<rich:dataTable value="#{productModifyBean.articles}" var="article" id="articleTable"
rows="15" >
<rich:column headerClass="headerOverflow artNrColumn">
<f:facet name="header">
<h:outputText value="articleNumber" />
</f:facet>
<h:outputText value="#{article.articleNumber}"/>
</rich:column>
<rich:column headerClass="headerOverflow shortNameColumn">
<f:facet name="header">
<h:outputText value="Name" />
</f:facet>
<h:outputText value="#{article.shortName}" />
</rich:column>
<rich:column headerClass="headerOverflow quantityColumn" >
<f:facet name="header">
<h:outputText value="Quantity" />
</f:facet>
<h:inputText value="#{article.quantity}" required="true"
requiredMessage="This is required" converterMessage="Error conversion"
id="modifyArticleFormatQuantity" >
</h:inputText>
<rich:message for="modifyArticleFormatQuantity" errorClass="errorColorRed" />
</rich:column>
</rich:dataTable>
<rich:dataScroller for="articleTable" renderIfSinglePage="false" boundaryControls="show" fastControls="hide" execute="@form" render="articleTable"
stepControls="show" style="float:right;" />
</h:panelGroup>
<br style="clear: both" />
<br style="clear: both" />
<div align="right" style="clear: both">
<a4j:commandButton value="#{msgs['button.modify'] }" styleClass="submitButton"
render="#{facesContext.validationFailed ? '@none' : 'articleForm'}"
actionListener="#{productModifyBean.modifyProduct}">
</a4j:commandButton>
</div>
</h:form>
数据验证应在用户按下提交按钮(以保存数据)以及用户使用分页转到不同页面时进行。
在将一个字段留空后单击提交按钮时,行为是正常的:它显示一个带有备注 'this is required'
的空字段然而,当移动到另一个页面时(例如点击“2”页面按钮),验证正确发生,但旧值被放回屏幕,因此说明该值应该被填充但显示它填充了一个值。
任何人都知道这个问题可能是什么原因,以及如何解决它?这是 RichFaces 中的错误,还是我忽略了什么?
我通过反复试验找到了解决方案:
如果我将数据滚动器更改为使用 render="@region" ,屏幕就会正确呈现。
<rich:dataScroller for="articleTable" renderIfSinglePage="false" boundaryControls="show" fastControls="hide" execute="@form" render="articleTable"
stepControls="show" style="float:right;" />