【问题标题】:primefaces tabView skip the form validation when tab changePrimefaces TabView跳过表单验证时JAB更改时
【发布时间】:2013-02-05 06:09:43
【问题描述】:

我正在使用 PrimeFaces 3.3 和 Mojarra 2.17。

我有一个包含p:tabView 的页面。第二个选项卡包含一个文本框和required="true"。当我从第二个选项卡导航到第一个选项卡时,它将验证文本框是否为空并显示一条错误消息(我有一个 PhaseListener 类来在全局 p:messages 中显示错误)。如何跳过此验证?

我在以下位置找不到任何解决方案:

我不想使用 PrimeFaces p:wizard

我的 tabView.xhtml:

<p:tabView id="tabView" dynamic="true" cache="false" activeIndex="0" >  
      <p:ajax event="tabChange" listener="#{test.onTabChange}"/> 
      <p:tab id="tab1" title="Tab1">
        <ui:include src="#{test.tab1}"></ui:include>
      </p:tab>
      <p:tab id="tab2" title="Tab2">  
        <ui:include src="#{test.tab2}"></ui:include>
      </p:tab>
</p:tabView>

在我的 Java 类中:

public void onTabChange(TabChangeEvent event) {              
     this.setTab1("tab1.xhtml");
     this.setTab2("tab2.xhtml");
 }

我的 tab1.xhtml:

<h:form id="form1">    
    <p:messages globalOnly="true" />
    tab1 page
    <br/>
</h:form>

我的 tab2.xhtml:

<h:form id="form2">
    <p:messages globalOnly="true" />
    <p>
        tab2 page
    </p>
    <p:inputText id="txt1" required="true" />
    <p:message for="txt1" display="text" />
    <p:commandButton value="Submit" update="@form" />
</h:form>

我的 PhaseListener 类:

public class MyPhaseListener implements PhaseListener {
    @Override
    public void afterPhase(PhaseEvent e) {
        if (e.getPhaseId() == PhaseId.PROCESS_VALIDATIONS) {
            if (FacesContext.getCurrentInstance().getMessageList().size() > 0) {
                String number = String.valueOf(FacesContext.getCurrentInstance().getMessageList().size());
                String errorMsg = "there are " + number + " errors.";
                FacesContext.getCurrentInstance().addMessage(
                        null,
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMsg,
                                errorMsg));
            }
        }
    }
}

【问题讨论】:

  • 使用您当前的设置,您没有那么多选择。您可以做的一件事是使用 EL 表达式使 required 属性成为条件
  • @kolossus,你能解释一下吗?我目前的设置还需要哪些选项?以及如何使用 EL 表达式使所需的属性有条件?

标签: validation jsf-2 primefaces onchange tabview


【解决方案1】:

在您的 ajax 事件标签中添加 immediate="true" 属性。这将阻止您的字段被验证,并且只会调用您的侦听器:

<p:ajax event="tabChange" listener="#{test.onTabChange}" immediate="true"/>

【讨论】:

  • 错误信息只是保留在之前的提交中还是在更改选项卡时显示?
  • 尝试在p:ajax中添加process="@none"
  • 如果添加进程="@none",则选项卡更改不起作用。如果process="@this",错误依然存在。
  • 我认为这个问题更多地取决于 tabView 如何处理选项卡更改。 &lt;p:ajax event="tabChange" listener="#{test.onTabChange}" immediate="true"/&gt; 只听,不管理标签更改
【解决方案2】:

我通过添加代码解决了我的问题:
FacesContext.getCurrentInstance().renderResponse();
在 backign bean 中的 TabChangeEvent 方法下..

例如:

public void onTabChange(TabChangeEvent event) {              
  this.setTab1("tab1.xhtml");
  this.setTab2("tab2.xhtml");
  FacesContext.getCurrentInstance().renderResponse();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多