使用后退按钮时防止 primefaces 向导执行验证
Prevent primefaces wizard from executing validation when using back button
我有一个 primefaces 向导,其中包含一个简单的表单和一个数据表。单击保存后,记录将显示在表单正下方的数据表中。现在要让用户移动到下一个选项卡,他至少应该输入一条记录,以便他可以继续到下一个选项卡。所以我做了一个检查,点击下一步,它验证用于填充数据表的列表是否为空。如果没有,他可以继续。现在我的问题是点击返回,提示验证。我怎样才能防止这种情况发生?只有在点击下一步时才会提示验证。
向导如下:
<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();
}
您可以只使用隐藏的输入字段并使用必需的属性。 primefaces wizzard 将验证下一个按钮上的字段,而不是后退按钮上的字段。
<h:inputHidden
required="#{empty CarComponent.partList}"
requiredMessage="Please enter a Part."
/>
添加到您的 if
验证条件以不验证新步骤是否为后一步,如下所示:
if (event.getOldStep().contains("part") && !event.getNewStep().equals("model")) {
...
}
或第一个 if
if (event.getNewStep().contains("model") {
return event.getNewStep();
}
我有一个 primefaces 向导,其中包含一个简单的表单和一个数据表。单击保存后,记录将显示在表单正下方的数据表中。现在要让用户移动到下一个选项卡,他至少应该输入一条记录,以便他可以继续到下一个选项卡。所以我做了一个检查,点击下一步,它验证用于填充数据表的列表是否为空。如果没有,他可以继续。现在我的问题是点击返回,提示验证。我怎样才能防止这种情况发生?只有在点击下一步时才会提示验证。
向导如下:
<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();
}
您可以只使用隐藏的输入字段并使用必需的属性。 primefaces wizzard 将验证下一个按钮上的字段,而不是后退按钮上的字段。
<h:inputHidden
required="#{empty CarComponent.partList}"
requiredMessage="Please enter a Part."
/>
添加到您的 if
验证条件以不验证新步骤是否为后一步,如下所示:
if (event.getOldStep().contains("part") && !event.getNewStep().equals("model")) {
...
}
或第一个 if
if (event.getNewStep().contains("model") {
return event.getNewStep();
}