Forms Wicket:验证DataTable组件内的嵌套表单

Forms Wicket:验证DataTable组件内的嵌套表单,forms,wicket,Forms,Wicket,我目前正在测试一个自定义DataTable的创建,其中我需要一个面板,其中一些表格单元格中有一个表单,结构如下: 外部表单>数据表(行>单元格>单元格>面板>内部表单) 目前,我能够使用外部表单的“提交”按钮成功提交这些嵌套表单(每个单元格中的内部表单),但内部表单不显示验证反馈消息(尽管我已检查并正在验证这些表单-验证错误时,外部表单将转到onError() 我相信这个问题在某种程度上与ListView的类似问题有关,在ListView中,我必须使用setReuseItems(true)才能获

我目前正在测试一个自定义DataTable的创建,其中我需要一个面板,其中一些表格单元格中有一个表单,结构如下:

外部表单>数据表(行>单元格>单元格>面板>内部表单)

目前,我能够使用外部表单的“提交”按钮成功提交这些嵌套表单(每个单元格中的内部表单),但内部表单不显示验证反馈消息(尽管我已检查并正在验证这些表单-验证错误时,外部表单将转到onError()

我相信这个问题在某种程度上与ListView的类似问题有关,在ListView中,我必须使用setReuseItems(true)才能获得反馈消息。(参考号:)

我试图配置DataTable重用项策略,甚至DataTable内部datagrid(从Wicket 6开始)重用策略,但仍然无法获得反馈消息。(参考: )

我开始认为我可能无法在DataTable级别上实现这一点,因为单元格的onPopulate()实际上只在AbstractDataGridView级别上调用。有人知道在数据表内部验证这些内部表单是否可行吗?如果可以,我如何实现这一点


感谢您的时间和关注。

我也遇到了同样的问题,我解决问题的方式如下:

Form<List<MyDataType>> form = new Form<List<MyDataType>>("form", getModel()) {
    @Override
    protected void onValidate() {
        super.onValidate();
        visitChildren(FormComponent.class, new IVisitor<FormComponent, Void>() {
            @Override
            public void component(FormComponent component, IVisit<Void> visit) {
                component.processInput();
                if (component.hasErrorMessage()) {
                    for (FeedbackMessage message :
                         component.getFeedbackMessages()) {
                        if (message.isError()) {
                            get(TABLE_ID).getFeedbackMessages().add(message);
                        }
                    }
                }
            }
        });
    }
};
formform=newform(“Form”,getModel()){
@凌驾
受保护的void onValidate(){
super.onValidate();
visitChildren(FormComponent.class,新的IVisitor(){
@凌驾
公共作废组件(FormComponent组件,IVisit访问){
processInput();
if(component.hasErrorMessage()){
对于(反馈消息:
component.getFeedbackMessages()){
if(message.isError()){
get(表ID).getFeedbackMessages().add(消息);
}
}
}
}
});
}
};
因此,基本上每当我验证我的
表单时,我都会手动检查内部
表单组件
并进行检查。然后,我将错误消息转发到具有自己的
反馈面板的表中

可能不是最优雅的解决方案,但它很有效。

table.setItemReuseStrategy(新的ReuseIfModelsEqualStrategy())为我设置了窍门

资料来源:

1.
2您是否尝试将内部形式添加到反馈面板过滤器?带有:feedback.setFilter(新组件feedbackmessagefilter(innerform));setFilter没有这样的运气。无论如何,谢谢你的评论。如果有人有类似的问题,我最终基于ListView创建了一个新的“CustomDataTable”组件。这样,我就可以使用setReuseItems(true)。