[英]PrimeFaces' p:wizard validation not working
我有一个带有一些标签的p:wizard
。 在第一个选项卡中,用户选择一个值(t :selectOneRadio
- 我使用的是 Tomahawk)。 这是一个必需的值。
如果用户没有 select 一个值,它不会 go 到下一个选项卡,但不会显示验证错误。 嗯。
如果用户选择了一个值,转到下一个选项卡,返回到第一个选项卡并选择不同的值,它将表现得好像这次没有选择任何值。 (也没有验证错误,但无法调用第二个选项卡)。
更糟糕的是:用户在第一个选项卡中选择一个值,转到第二个选项卡,尝试从那里调用一个操作......出现验证消息; 它就像在第一个选项卡中没有选择任何值一样。
对此有什么解释吗?
更新
PrimeFaces 论坛中建议的解决方案对我有用。 (将 process="@this" 添加到命令按钮。)
您可能要考虑的另一件事..
如果您在跨选项卡的必填字段方面遇到问题,您可以通过在向导组件中实现流程事件在步骤之间手动执行您自己的验证。
public String onFlowProcess(FlowEvent event) {
//First perform check to see if the user is attempting to remove the last visitor
if ("confirm".equals(event.getNewStep()) && (visitors == null || visitors.isEmpty())) {
log.debug("Validation failed for empty visitors");
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Visit must have at least one visitor.", null);
FacesContext.getCurrentInstance().addMessage(null, msg);
return event.getOldStep();
}
return event.getNewStep();
}
我在 .xhtml 文件中声明了 flowListener 事件。 试试这个,看看验证消息 go 是否消失。
<p:wizard showNavBar="true" widgetVar="scheduler" flowListener="#{scheduleVisit.onFlowProcess}" showStepStatus="true">
更新
PrimeFaces 论坛中建议的解决方案对我有用。 (将process="@this"
添加到commandButton
。)不知道为什么!
这听起来可能是几个可能的问题之一。 您可能会收到验证错误,但您可能没有正确声明您的消息组件,或者它没有得到更新。 如果是这种情况,它们可能是您在页面上看不到呈现的验证错误。
来自向导组件的 Primefaces 指南 2.2:
AJAX 和部分验证 - 步骤之间的切换基于 ajax,这意味着每个步骤都使用 ajax 动态加载。 部分验证也是内置的,这样当你点击next时,只验证当前步骤,如果当前步骤有效,next tab的内容会加载ajax。 流程返回时不执行验证。
另一个问题可能是您的属性未在托管 bean 中正确设置,这会导致验证问题。 这似乎更有可能。
我无法思考为什么除了 selectOneRadio 的“必需”之外还需要验证? 您的选择数量有限,必须选择一个,因此不应出现错误值或无效值。
您只需在单选按钮上设置 required 属性即可。
前任:
<p:selectOneRadio required="true" requiredMessage="you must put it">
<f:selectItem itemLabel="Días Laborales" itemValue="diasLab" />
<f:selectItem itemLabel="Días Ticados" itemValue="diasTic" />
</p:selectOneRadio>
PrimeFaces 的 p:wizard 验证问题
步骤:1 customerInformation.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<p:wizard flowListener="#{customerForm.onFlowProcess}">
<p:tab id="information" title="Information">
<p:panel header="Customer Information">
<h:outputLabel value="First Name" for="fName"/>
<h:inputText id="fname" value="#{customer.fname}"/>
<h:outputLabel value="Last Name" for="lName"/>
<h:inputText id="lname" value="#{customer.lname}"/>
</panel>
</p:tab>
<p:tab id="details" title="Details">
<p:panel header="Customer Details">
<h:outputLabel value="Address Line 1" for="addressOne"/>
<h:inputText id="addressOne" value="#{customer.addressOne}"/>
<h:outputLabel value="Address Line 2" for="addressTwo"/>
<h:inputText id="addressTwo" value="#{customer.addressTwo}"/>
</panel>
</p:tab>
</p:wizard>
</html>
步骤:2创建bean class CustomerForm.java
public class CustomerForm implements Serializable {
private static final long serialVersionUID = 1L;
private String fName;
private String lName;
private String addressOne;
private String addressTwo;
private static Logger logger = Logger.getLogger(CustomerForm.class.getName());
/**
* Call this method in p:wizard tag
*
*/
public String onFlowProcess(FlowEvent event) {
logger.info("Current wizard step:" + event.getOldStep());
logger.info("Next step:" + event.getNewStep());
return event.getNewStep();
}
/**
* @return the fName
*/
public String getfName() {
return fName;
}
/**
* @param fName the fName to set
*/
public void setfName(String fName) {
this.fName = fName;
}
/**
* @return the lName
*/
public String getlName() {
return lName;
}
/**
* @param lName the lName to set
*/
public void setlName(String lName) {
this.lName = lName;
}
/**
* @return the addressOne
*/
public String getAddressOne() {
return addressOne;
}
/**
* @param addressOne the addressOne to set
*/
public void setAddressOne(String addressOne) {
this.addressOne = addressOne;
}
/**
* @return the addressTwo
*/
public String getAddressTwo() {
return addressTwo;
}
/**
* @param addressTwo the addressTwo to set
*/
public void setAddressTwo(String addressTwo) {
this.addressTwo = addressTwo;
}
}
注意:不要将 required="true" 放在 xhtml 文件中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.