PrimeFaces的p:向导验证不起作用

时间:2011-05-30 14:17:47

标签: validation jsf primefaces wizard

我有p:wizard个标签。在第一个选项卡中,用户选择一个值(t :selectOneRadio - 我正在使用Tomahawk)。这是必需的值。

如果用户未选择值,则不会转到下一个选项卡,但不会显示验证错误。 HM。

如果用户选择了一个值,则转到下一个选项卡,返回第一个选项卡并选择一个不同的值,它的行为就像这次没有选择任何值一样。 (也没有验证错误,但无法调用第二个选项卡。)

更糟糕的是:用户在第一个选项卡中选择一个值,转到第二个选项卡,尝试从那里调用一个操作......出现验证消息;它就像在第一个选项卡中没有选择任何值一样。

对此有任何解释吗?

更新

PrimeFaces论坛中的解决方案suggested为我工作。 (将process =“@ this”添加到commandButton。)

5 个答案:

答案 0 :(得分:4)

您可能想要考虑另一件事......

如果您在选项卡中遇到必填字段时遇到问题,则可以通过在向导组件中实现流事件来手动执行各步骤之间的验证。

    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事件。试试这个,看看验证消息是否消失。

<p:wizard showNavBar="true" widgetVar="scheduler" flowListener="#{scheduleVisit.onFlowProcess}" showStepStatus="true">

答案 1 :(得分:4)

<强>更新

PrimeFaces论坛中的解决方案suggested为我工作。 (将process="@this"添加到commandButton。)不知道为什么

答案 2 :(得分:2)

听起来这可能是几个可能的问题之一。您可能会收到验证错误,但是您可能没有正确声明您的消息组件,或者它没有得到更新。如果是这种情况,则可能是您在页面上看不到的验证错误。

从Primefaces Guide 2.2 for Wizard组件:

  

AJAX和部分验证 -   步骤之间的切换基于ajax,这意味着每个步骤都是用ajax动态加载的。   部分验证也是内置的,通过这种方式,当您单击下一步时,仅验证当前步骤,   如果当前步骤有效,则下一个选项卡的内容将加载ajax。验证不会执行   当流量回来时。

另一个问题可能是您的属性未在托管bean中正确设置,这导致验证问题。这似乎更有可能。

我无法思考为什么需要验证除了'Required'以外的selectOneRadio?您的选择数量有限,必须选择一个,因此不应该使用不正确的值或无效值。

答案 3 :(得分:1)

你只需要在你的单选按钮上输入所需的属性即可。

例如:

<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>

答案 4 :(得分:-1)

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>

步骤:2创建bean类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;
    }

}

注意:请勿在xhtml文件中输入required =“true”