【问题标题】:Prevent primefaces wizard from executing validation when using back button使用后退按钮时防止 primefaces 向导执行验证
【发布时间】:2015-12-19 09:54:49
【问题描述】:

我有一个 primefaces 向导,其中包含一个简单的表单和一个数据表。单击保存后,记录将显示在表单正下方的数据表中。现在为了让用户移动到下一个选项卡,他至少应该输入一条记录,以便他可以继续到下一个选项卡。所以我做了一个检查,点击 next ,它会验证用于填充数据表的列表是否为空。如果没有,他可以继续。现在我的问题是点击返回,提示验证。我怎样才能防止这种情况?只有在单击下一步时才会提示验证。

下面是向导:

    <p:wizard flowListener="#{CarComponent.onFlowProcess}"  showStepStatus="true">

            <p:tab id="model" title="Model">

                <p:panel>
                    <p:messages />
                    <h:panelGrid id="mdl" columns="2" styleClass="grid"
                        columnClasses="label,value">
                        <h:outputText
                            value="Date" />
                        <p:calendar id="date"
                            value="#{}"
                            required="true" converter="primefacesCalendarConverter"
                            pattern="dd/MM/yyyy" />

                    </h:panelGrid>
                </p:panel>
            </p:tab>


            <p:tab id="part">

                <p:panel>
                    <p:messages />
                    <h:panelGrid id="partdetails" columns="2" styleClass="grid"
                        columnClasses="label,value">
                        <h:outputText
                            value="PartNo:" />

                        <h:inputText id="partno"
                            value="#{..}"
                            required="false" maxlength="500">

                        </h:inputText>

                     <h:inputHidden
                      required="#{empty CarComponent.partList}"
                      requiredMessage="Please enter a Part." 
                       />

                        <h:panelGroup>
                            <p:commandButton image="save" ajax="false"
                                value="Save" process="@this,partno"
                                action="#{CarComponent.saveCarDetails(...)}" />
                        </h:panelGroup>
                    </h:panelGrid>
                </p:panel>


                <p:panel>
                    <h:panelGroup>
                        <p:dataTable id="dta_obj" editable="true"
                            value="#{CarComponent.partList}"
                            var="currentobj" rows="15" paginator="true"
                            paginatorPosition="bottom">
                            <p:column>
                                <f:facet name="header">
                                    <h:outputText
                                        value="Part No:" />
                                </f:facet>
                                <p:cellEditor>
                                    <f:facet name="output">
                                        <h:outputText value="#{current.partno}" />
                                    </f:facet>
                                    <f:facet name="input">
                                        <h:inputText value="#{current.partno}" />
                                    </f:facet>
                                </p:cellEditor>
                            </p:column>


                        </p:dataTable>
                    </h:panelGroup>
                </p:panel>
            </p:tab>


            ...
        </p:wizard>

流监听如下:

     public String onFlowProcess(FlowEvent event) {


    if (event.getOldStep().contains("model")) {

        //some code here
    }

    if (event.getOldStep().contains("part")) {
        partList = car.getPart();
        if(partList.isEmpty()){

            String errorMsg="Please enter a Part.";

            FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR,errorMsg, ""));
            return event.getOldStep();
        }
    }

    return event.getNewStep();
}

【问题讨论】:

    标签: validation jsf primefaces wizard


    【解决方案1】:

    添加到您的if 验证条件以不验证新步骤是否是后面的步骤,如下所示:

    if (event.getOldStep().contains("part") && !event.getNewStep().equals("model")) {
        ...
    }
    

    或者对于第一个如果

    if (event.getNewStep().contains("model") {
        return event.getNewStep();
    }
    

    【讨论】:

      【解决方案2】:

      您可以只使用隐藏的输入字段并使用 required 属性。 primefaces 向导将验证下一步按钮上的字段,而不是后退按钮上的字段。

      <h:inputHidden
          required="#{empty CarComponent.partList}"
          requiredMessage="Please enter a Part." 
      />
      

      【讨论】:

      • 好的,我在表单中添加隐藏字段,如下所示: 现在我无法输入记录。当我单击保存时,它会提示所需的消息。但它允许我做回来。
      • 当您单击命令按钮时,排除隐藏的输入被处理(例如仅处理包含所需信息的面板网格)...除此之外:不要使用空检查,使用空作为我做到了。这将涵盖空检查和空检查。 ....
      • 我在 panelgrid 标签之后添加了它,还是一样!如何排除它?
      • 看看这里的一些例子如何使用进程属性:primefaces.org/showcase/ui/ajax/process.xhtml
      • 您应该进行 AJAX 调用以使其正常工作。这似乎更适合这里
      猜你喜欢
      • 2016-10-01
      • 2015-12-04
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 2011-11-13
      相关资源
      最近更新 更多