2012-05-11 37 views
0

我用对后:这样如何保持同一选项卡上提交表单

<ui:composition template="./WEB-INF/templates/masterTemplate.xhtml"> 
    <ui:define name="windowTitle"> 
     #{msgs.home} 
    </ui:define> 

    <ui:define name="content"> 
     <p:tabView id="tabView" dynamic="false"> 

      <p:tab id="tab1" title="#{msgs.home}"> 
       <ui:include src="/homePages/home.xhtml" /> 
      </p:tab> <!--end of tab1 --> 

      <p:tab id="tab2" title="#{msgs.join}"> 
       <ui:include src="/homePages/join.xhtml" /> 
      </p:tab> <!--end of tab2 --> 

      <p:tab id="tab3" title="#{msgs.signIn}"> 
       <ui:include src="/homePages/login.xhtml" /> 
      </p:tab> <!--end of tab3 --> 

     </p:tabView> 
    </ui:define> 
</ui:composition> 

标签视图这是我join.xhtml页

<h:body> 
    <ui:composition> 
     <div id="join" style="border-style:solid; border-width:5px; padding: 10px;" > 
      <div id="joinFormPosition" class="left"> 
       <h:form id="joinForm"> 
        <h:outputText id="joinMessgae" value="#{msgs.joinMessgae}" /> 
        <span class="asterisk">*</span><span class="labels">#{msgs.signInName}: </span> 
        <p:inputText id="name" 
           value="#{joinPage.signInName}" 
           required="true"/> 
        <p:message for="name" /> 
        ... 

        <div id="submitButton"> 
         <h:commandButton id="submitBtn" 
             value="Submit" 
             actionListener="#{join.saveUser}" /> 
        </div> 
       </h:form> 
      </div> <!--end of joinFormPosition --> 
     </div> <!--end of join --> 
    </ui:composition> 
</h:body> 

login.xhtml

<ui:composition> 

     <div id="login" style="border-style:solid; border-width:5px; padding: 10px;" > 

      <div id="loginFormPosition" class="left"> 

       <h:form id="loginForm"> 
        <h:outputText value="#{msgs.signIn}" /> 
        ..... 
        <div id="signInButton"> 
         <h:commandButton id="signInBtn" 
             value="Submit" 
             actionListener="#{login.signIn}" 
             action ="#{login.outcome}"/> 
        </div> 
       </h:form> 
      </div> <!--end of loginFormPosition --> 
     </div> <!--end of login --> 
    </ui:composition> 

如果我在标签连接,然后提交表单,如果任何验证失败,然后我切换到第一个选项卡。我想,如果我点击提交按钮,并且验证是否失败,或者我停留在同一个选项卡上。我在登录标签上遇到同样的情况。如何在提交表单后留在同一个标​​签页上?

感谢

回答

3

您可以将TabView的结合支持bean一个TabView的对象,并设置你的活动指数出现。

<p:tabView binding="#{myTabBean.messagesTab}"> 

然后在myTabBean:

private TabView messagesTab = new TabView(); 

public TabView getMessagesTab() { 
    return messagesTab; 
} 

public void setMessagesTab(TabView messagesTab) { 
    this.messagesTab = messagesTab; 
} 


public void someDecisionMethod(){ 
    int idx=1 
    this.messagesTab.setActiveIndex(idx); 
} 
+0

绑定不是要走的路。将activeIndex属性与tabChange事件组合使用。 – Kukeltje

0

我知道这个问题是旧的,但我只是面临着同样的问题,年后,primefaces 5.2。对于您的特定情况,可能会有多种解决方案,例如仅更新您的选项卡的内容而不是整个页面。但我真的必须重新加载整个页面(区域设置更改):

要“记住”activeTab,您基本上只需绑定视图范围的managedBean中的activeIndex并指定p:ajax事件侦听器。但作为你的p:tabView不在表单中,并且标签本身有它们自己的表单,有一些已知的问题:https://github.com/primefaces/primefaces/issues/695最简单的解决方法是将p:ajax的partialSubmit设置为true。因此,这是所有需要设置activeIndex并保持标签上。结果:

XHTML:

<p:tabView activeIndex="#{myManagedBean.activeTabIndex}"> 
    <p:ajax event="tabChange" partialSubmit="true" /> 

myManagedBean:

//plus its getter and setter 
private Integer activeTabIndex; 

编辑:这可能足以唯一指定如上所述的<p:ajax event="tabChange" partialSubmit="true" />甚至没有绑定activeIndex。至少对于我的用例来说已经足够了。

相关问题