【问题标题】:Primefaces dataTable single selection validationPrimefaces dataTable 单选验证
【发布时间】:2016-10-19 14:05:51
【问题描述】:

我可以像这样验证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 与单行选择一起使用将实现相同的目标 - 它允许您使用selection 属性而不是value 属性和使用value 属性而不是@987654327 来选择一行@。

<p:dataTable id="ActivitiesTable" var="row"
        value="#{myBean.rows}"
        selection="#{myBean.selectedRow}"
        rowKey="#{row.activityId}">
    <p:column selectionMode="single"/>
    ...
</p:dataTable>

但是我在 p:dataTable 上看不到任何验证选项(例如 required 属性)。

有没有一种方法或解决方法可以对p:dataTable 进行所需的选择验证,类似于p:selectOneMenu 上的required 属性?

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

【问题讨论】:

    标签: validation primefaces datatable


    【解决方案1】:

    据我所知,primefaces 在数据表中没有此功能,但您可以使用您的代码,

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

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

    【讨论】:

    • 我认为您建议在 update-model-value 阶段之后进行测试。这在提交中很容易做到,例如带有 actionListener 的 p:commandButton。但是我在p:wizard 中,当单击“下一步”按钮时我需要它发生,它只进行标准验证。有没有办法做到这一点?
    • 您是否尝试更改向导的下一步按钮的事件,您可以查看此示例:stackoverflow.com/questions/17995208/… 或者这也可以提供帮助:journaldev.com/3415/…
    • 这给了我一些成功,但并不完整。缺点是在flowListener 中添加消息是只有在所有其他验证都通过时才会显示错误消息。当用户收到一堆验证错误,然后修复它们并提交时,这会产生尴尬的行为,只是为了获得dataTable 的附加错误消息。
    • 它已经接近了,如果没有更好的结果,我可能会最终选择它。感谢您的想法!
    【解决方案2】:

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

    <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."/>
    

    这样,您可以在inputHidden 上添加常规验证器(如要求)并在提交表单时对其进行处理。

    【讨论】:

      猜你喜欢
      • 2016-03-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 2014-03-08
      • 2013-10-29
      • 2012-06-29
      相关资源
      最近更新 更多