Validation PrimeFaces'p:向导验证不起作用
我有一个带有一些选项卡的p:向导。在第一个选项卡中,用户选择一个值t:selectOneRadio-我正在使用Tomahawk。这是一个必需的值 如果用户未选择值,则不会转到下一个选项卡,但不会显示验证错误。嗯 如果用户选择了一个值,转到下一个选项卡,返回到第一个选项卡并选择了一个不同的值,那么它的行为就好像这次没有选择任何值一样。也没有验证错误,但无法调用第二个选项卡 更糟糕的是:用户在第一个选项卡中选择一个值,转到第二个选项卡,尝试从那里调用操作。。。出现验证消息;它的作用就像在第一个选项卡中没有选择任何值一样 有什么解释吗 更新Validation PrimeFaces'p:向导验证不起作用,validation,jsf,primefaces,wizard,Validation,Jsf,Primefaces,Wizard,我有一个带有一些选项卡的p:向导。在第一个选项卡中,用户选择一个值t:selectOneRadio-我正在使用Tomahawk。这是一个必需的值 如果用户未选择值,则不会转到下一个选项卡,但不会显示验证错误。嗯 如果用户选择了一个值,转到下一个选项卡,返回到第一个选项卡并选择了一个不同的值,那么它的行为就好像这次没有选择任何值一样。也没有验证错误,但无法调用第二个选项卡 更糟糕的是:用户在第一个选项卡中选择一个值,转到第二个选项卡,尝试从那里调用操作。。。出现验证消息;它的作用就像在第一个选项卡
PrimeFaces论坛上的解决方案对我很有效。将process=@this添加到commandButton。这听起来可能是几个可能的问题之一。您可能会收到验证错误,但是您可能没有正确声明消息组件,或者它没有得到更新。如果是这种情况,则可能是验证错误,而您在页面上看不到这些错误 从向导组件的Primefaces指南2.2中: AJAX和部分验证- 步骤之间的切换基于ajax,这意味着每个步骤都使用ajax动态加载。 部分验证也是内置的,通过这种方式,当您单击“下一步”时,只验证当前步骤, 如果当前步骤有效,则下一个选项卡的内容将使用ajax加载。不执行验证 当流量返回时 另一个问题可能是您的属性没有在托管bean中正确设置,这导致了验证问题。这似乎更有可能
我在想为什么除了selectOneRadio的“必需”之外还需要验证?您有有限的选择数,必须选择一个,因此不正确的值或无效值不可能。
另一件您可能要考虑的事情。
如果您在跨选项卡的必填字段方面遇到问题,可以通过在向导组件中实现流事件,在步骤之间手动执行自己的验证 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();
}
以及我声明flowListener事件的.xhtml文件。试试这个,看看验证消息是否消失了
<p:wizard showNavBar="true" widgetVar="scheduler" flowListener="#{scheduleVisit.onFlowProcess}" showStepStatus="true">
更新
PrimeFaces论坛上的解决方案对我很有效。将process=@this添加到commandButton。不知道为什么 您只需在单选按钮上输入属性required true 例:
PrimeFaces'p:向导验证问题 步骤: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>
注意:不要将required=true放在xhtml文件中感谢您抽出时间!所需的是我对selectOneRadio的唯一验证。但是向导在调用下一个选项卡后似乎忘记了该值。这似乎是一个普遍的问题:那就是。。。。奇怪的我在应用程序中使用了一个p:向导,我根本没有这个问题。而且我不知道你做错了什么。您目前使用的Primefaces和Mojarra版本是什么?我使用的是Primefaces 2.2.1,我不使用Mojarra,我使用的是MyFaces。除此之外,PrimeFaces对我来说非常有用。我在PrimeFaces论坛的某个地方读到了一个变通方法,我现在找不到链接,上面说,在以下选项卡上使用InAuthiden将有助于保留该值。然而,这对我来说是行不通的。我想我必须做一个更正,尽管我确信我已经从我最初的帖子中看到了这种行为!:当我尝试从第二个选项卡p:commandButton调用操作时,会出现所需的消息。“后退”按钮将不再工作。这是我目前使用的Primefaces的同一版本,因为它看起来是最稳定的。我会尝试使用selectOneMenu和其他没有转换器或SelectItem值的select组件,看看这是否会有所不同。改为使用字符串,看看bean属性是否保持不变。使用这种技术,值始终存在。我想我已经修好了。我发现了这个:我将process=@this添加到commandButton中,它可以正常工作。但我不知道为什么。我希望它没有副作用。嗯,非常感谢你的帮助,枫叶班!好的请将您的解决方案作为答案发布,以方便将来搜索此问题的人员。
<?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>
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;
}
}