validation - Richfaces Datatable 在验证失败时丢失提交的输入值

标签 validation jsf datatable richfaces

我有两个输入 - 一个在“正常”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 parameterjavax .faces.ViewState.

关于validation - Richfaces Datatable 在验证失败时丢失提交的输入值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26807283/

相关文章:

python - 表单启动时设置表单值

jsf - <一个jsf :rendered ="#{...}"> is not interpreted as passthrough element

javascript - 如何将 DataTable 与对象数组一起使用?

ajax - f :ajax listener method in h:selectOneMenu is not executed

jsf - :commandButton not working inside h:dataTable

c# - C# DataTable 中的不同列值

html - XHTML - 添加新元素

ruby-on-rails - 为自定义验证器创建测试

java - 模式更新后 jOOQ 生成类的运行时验证?

html - 使选项卡式内容可滚动