6

我有一个需要在另一个选项卡中打开的报告,但前提是验证没有失败。在我的情况下,验证失败,并且同一页面在另一个选项卡中打开,并出现验证错误。

4

2 回答 2

5

Luiggi 已经回答了 POST 问题。但是,如果报告可通过 GET 请求获得,那么还有其他方法。

  1. window.open()中使用oncomplete

     <h:form>
         ...
         <p:commandButton action="#{bean.submit}" update="@form" 
             oncomplete="if (args &amp;&amp; !args.validationFailed) window.open('reportURL')" />
     </h:form>
    
  2. 或者有条件地渲染一个<h:outputScript>with window.open()

     <h:form>
         ...
         <p:commandButton action="#{bean.submit}" update="@form" />
         <h:outputScript rendered="#{facesContext.postback and not facesContext.validationFailed}">
             window.open('reportURL');
         </h:outputScript>
     </h:form>
    
  3. 或将 PrimeFacesPrimefaces#execute()window.open().

     public void submit() { 
         // ...
         PrimeFaces.current().executeScript("window.open('reportURL');");
     }
    

第一种方式要求在提交之前已经定义了 URL,后两种方式允许您使用像这样的动态 URL window.open('#{bean.reportURL}')

于 2013-01-29T14:43:52.143 回答
1

我不知道这是否是一个明确的答案,但你可以有 2 个:1 将触发服务器验证,其他将在新页面中调用报告。这是一个开始代码:

<h:form id="frmSomeReport">
    <!-- your fields with validations and stuff -->

    <!-- the 1st commandLink that will trigger the validations -->
    <!-- use the oncomplete JS method to trigger the 2nd link click -->
    <p:commandLink id="lnkShowReport" value="Show report"
        oncomplete="if (args &amp;&amp; !args.validationFailed) document.getElementById('frmSomeReport:lnkRealShowReport').click()" />

    <!-- the 2nd commandLink that will trigger the report in new window -->
    <!-- this commandLink is "non visible" for users -->
    <h:commandLink id="lnkRealShowReport" style="display:none"
        immediate="true" action="#{yourBean.yourAction}" target="_blank" />

</h:form>
<!-- a component to show the validation messages -->
<p:growl />

为了检查验证阶段是否包含任何错误,请检查如何在执行 ajax 命令时找到验证错误的指示(必需=“true”)

于 2013-01-29T13:56:08.180 回答