Validation Primefaces数据表单一选择验证

Validation Primefaces数据表单一选择验证,validation,primefaces,datatable,Validation,Primefaces,Datatable,我可以像这样验证p:selectOneMenu: <p:selectOneMenu id="eventTimezoneDropdown" value="#{myBean.eventTimeZone}" required="true" requiredMessage="The TimeZone must be specified." effect="none"> <f:selectItems value="#

我可以像这样验证
p:selectOneMenu

<p:selectOneMenu id="eventTimezoneDropdown"
        value="#{myBean.eventTimeZone}"
        required="true"
        requiredMessage="The TimeZone must be specified."
        effect="none">
    <f:selectItems value="#{myBean.timeZoneItems}"/>
</p:selectOneMenu>
但是,我在
p:dataTable
上没有看到任何验证选项(例如
required
属性)

是否有一种方法或解决方法可以在
p:dataTable
上进行必要的选择验证,类似于
p:selectOneMenu
上的
required
属性


环境:Primefaces 5.3、JSF 2.2.8-14、Tomcat 7.0.68。

据我所知,Primefaces中的datatable中没有此功能,但您可以使用代码

我建议您可以在ManagedBean中执行相同的事件,这样您就可以检查是否选择了一行,如果选择了,那么确定,否则您可以创建一条简单的消息,通知用户需要选择一行,如下所示:

public void requiredSelect() {
    if (myObject == null) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                FacesMessage.SEVERITY_ERROR, "Error", "My object is required!"));
    }
}

解决此问题的另一种方法是使用隐藏的输入字段,该字段绑定到行选择时更新的相同值

<p:dataTable id="ActivitiesTable" var="row"
    value="#{myBean.rows}"
    selection="#{myBean.selectedRow}"
    rowKey="#{row.activityId}">
<p:ajax event="rowSelectRadio" update="@parent:hiddenTimezoneInput"
<p:column selectionMode="single"/>
...
</p:dataTable>

<h:inputHidden id="hiddenTimezoneInput" value="#{myBean.selectedRow}"
               required="true" requiredMessage="The TimeZone must be specified."/>


我认为您建议在更新模型值阶段之后进行测试。这在提交中很容易做到,例如带有actionListener的
p:commandButton
。但是,我在一个
p:wizard
中,我需要在单击“下一步”按钮时执行该操作,该按钮只执行标准验证。有办法吗?您是否尝试更改向导的“下一步”按钮的事件,您可以检查此示例:或者这也有帮助:这给了我一些成功,但不完全。缺点是在
flowListener
中添加一条消息是,只有在所有其他验证都通过时,才会显示错误消息。当用户收到一堆验证错误,然后修复它们并提交,结果却得到了
数据表的额外错误消息时,这会导致尴尬的行为。很接近,如果没有更好的结果,我可能会继续使用它。谢谢你的主意!
<p:dataTable id="ActivitiesTable" var="row"
    value="#{myBean.rows}"
    selection="#{myBean.selectedRow}"
    rowKey="#{row.activityId}">
<p:ajax event="rowSelectRadio" update="@parent:hiddenTimezoneInput"
<p:column selectionMode="single"/>
...
</p:dataTable>

<h:inputHidden id="hiddenTimezoneInput" value="#{myBean.selectedRow}"
               required="true" requiredMessage="The TimeZone must be specified."/>