我有两个输入 - 一个在“正常”h:dataTable
中,一个在 rich:dataTable
中 当我提交错误的值时,即验证失败, “正常”一个保留我提交的值,而第二个丢失它。请参阅以下代码片段(输入任何值并按下按钮):
受管Bean
@ManagedBean
@ViewScoped
public class TestController implements Serializable {
private static final long serialVersionUID = -484022507596298941L;
private String[] stringArray1 = {"Element 1", "Element 2"}; // + Getter
private String[] stringArray2 = {"Element A", "Element B"}; // + Getter
private Map<String, String> inputValues = new HashMap<String, String>(4); // + Getter
public TestController() {
inputValues.put(stringArray1[0], "");
inputValues.put(stringArray1[1], "");
inputValues.put(stringArray2[0], "");
inputValues.put(stringArray2[1], "");
}
public void doSomething() {
System.out.println("Did something");
}
public void validate(FacesContext facesContext, UIComponent uiComponent, Object value) {
throw new ValidatorException(new FacesMessage("This can never be valid."));
}
}
查看
<h:form>
<h1>h:dataTable</h1>
<h:dataTable id="table1" value="#{testController.stringArray1}" var="string" columnClasses="inactive">
<h:column>
<h:outputText value="#{string}:"/>
<h:inputText id="someInput" value="#{testController.inputValues[string]}" validator="#{testController.validate}"/>
<h:message for="someInput" id="msg" style="color: red;"/>
</h:column>
</h:dataTable>
<h1>rich:dataTable</h1>
<rich:dataTable id="table2" value="#{testController.stringArray2}" var="string">
<rich:column>
<h:outputText value="#{string}:"/>
<h:inputText id="someInput" value="#{testController.inputValues[string]}" validator="#{testController.validate}"/>
<h:message for="someInput" id="msg" style="color: red;"/>
</rich:column>
</rich:dataTable>
<h:commandButton id="button" action="#{testController.doSomething}" value="do something"/>
</h:form>
这是已知的 Richfaces 行为还是某种错误?有没有办法让它的行为与普通的 JSF-DataTable 一样?使用 h:dataTable
并不总是一种选择,丢失“我刚刚要纠正它”的输入是相当烦人的。
补充: 我刚刚检查了 ui:repeat 和 a4j:repeat 的行为,它们是一样的:ui:repeat 保留提交的值,而 a4j:repeat 不保留提交的值。
更新:重新编写示例代码以排除评论中提到的一些可能的问题(输入字段现在指向不同的值;只有一个表单元素)。
在带有 RichFaces 4.3.7 和 JBoss AS 7 的 Mojarra 2.1.21 以及带有 RichFaces 4.5.0 Alpha3 和 JBoss Wildlfy 的 Mojarra 2.2.7 上测试 - 结果相同。
最佳答案
我刚刚使用 Richefaces 4.3.7 和 Mojarra 2.2.6 分别尝试了您页面的每个 form
,它运行良好!我没有注意到任何异常行为,当验证失败时我没有丢失任何值。这意味着 Richfaces 组件没有验证问题。
但是,当在单个页面中使用这两种形式时,我注意到当我提交第一种形式时,第二种形式的 inputText
失去了它的值(value),而如果我们提交 form2
第一个表单的 inputText
没有失去它的值(value),我猜这是因为 JSF 将它的 HTML 组件的状态存储在 javax.faces.ViewState
并且对 Richfaces 组件不做同样的事情,使用 Firebug
您可以轻松验证这两个 POST 请求之间唯一通用的 request parameter
是 javax .faces.ViewState
.
关于validation - Richfaces Datatable 在验证失败时丢失提交的输入值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26807283/