2010-08-24 77 views
6

我會盡量儘量簡短,請留在我這裏有沒有辦法在點擊按鈕時不發送整個Web表單?

「A.jsf」 - >管理豆芽:黃 「#{} bean.list」:要帶我們去B.jsf

 <p:growl id="msgs" showDetail="true"/> 
     <h:form id="myform1" enctype="multipart/form-data"> 
      <p:panel header="Upload" style="font-size: 11px;"> 
       <h:panelGrid columns="2" cellpadding="10"> 
        <h:outputLabel value="Drawing:" /> 
        <p:fileUpload fileUploadListener="#{bean.handleFileUpload}" update="msgs" allowTypes="*.*;"/>       
       </h:panelGrid> 
       <p:commandButton ajax="false" immediate="true" id="back" value="Back" action="#{bean.list}"/> 
       <p:commandButton ajax="false" id="persist" value="Persist" action="#{bean.handleRevision}" /> 
      </p:panel> 
     </h:form> 

然後handleFileUpload()

 if(!upload){ 
      FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "You do not have permission to upload."); 
      FacesContext.getCurrentInstance().addMessage(null, msg); 
     } 
     ... 

「B.jsf」 - >管理的bean:bean2

... 
<p:growl id="msgs" showDetail="true"/> 
... 

當我點擊上傳時,它給我一個咆哮的錯誤信息「你沒有上傳權限」,這很好。但是當我點擊「返回」時,會將我帶到B.jsf,我看到咆哮消息「您沒有上傳權限」。再次。似乎發生的事情是,當我點擊「返回」時,我發送其他表單請求上傳,然後生成相同的錯誤消息,然後顯示在B.jsf上。有沒有辦法解決這個問題,除了把「後退」按鈕放到一個空的表格中,因爲現在我有兩個按鈕站在彼此的頂部,而不是並排。我試着這樣做:

FacesContext.getCurrentInstance().addMessage("tom", msg); 

希望它會發送到與ID =「湯姆」組件,所以後來的咆哮與ID =封郵件,不會得到負荷,但沒有運氣。當我單擊Back按鈕時,我嘗試打開upload標誌,但在處理back導航的方法被調用之前,Web表單被請求。

它不是簡短,因爲我想它是,所以我想爲此道歉:

回答

5

把「返回」按鈕到一個空的身旁,因爲現在我有兩個按鈕,站在對方的頂部

的HTML <form>缺省爲block element。 HTML塊元素默認放置在一個新行中。你真的想把它做成inline element。你可以在CSS中使用display: inline;

回到實際問題,但令我驚訝的是,儘管p:commandButton中有immediate="true",但仍調用fileUploadListener方法。我試圖重現這一點,我可以證實這一點。但我不希望它發生。正常情況下immediate="true"上的按鈕跳過提交「整個」表單(至少,跳過UIInput組件沒有此屬性)的解決方案。進一步調查瞭解到,p:fileUpload根本不是UIInput組件,並且在應用請求值階段觸發偵聽器,而不是驗證或更新模型值階段。所以這種行爲是完全可以預測的,但在設計中仍然是一個疏忽。

由於p:fileUpload要求p:commandButton組件上ajax="false",可以在另一方面也只是從背面按鈕,以便觸發一個ajaxical請求並特此跳過fileUploadListener被調用將其刪除。

+0

在'Back'按鈕的'p:commandButton'上取出'ajax =「false」'確實不會阻止'fileUploadListener'被調用,但是也阻止了'導航流程'。因此,'Back'按鈕不會帶我到哪裏,但是'display:inline'很好用,非常感謝您花費時間在它上面,BalusC – 2010-08-25 14:07:59

+0

不客氣。 – BalusC 2010-08-25 14:10:11

2

其實d,把按鈕以不同的形式聽起來像一個很好的解決方案。按鈕不再對齊的原因是新的起始<form>元素從其自己的行開始。您應該可以通過將form { display: inline; }添加到您的CSS文件來防止此問題。這就是說,如果你有一些你想擺脫的遺留的錯誤信息,你可以在你的支持bean的初始化方法(如果有的話)中做到這一點。以下作品peachily:

public void clearErrorMessages() { 
    //it may get messy to debug why messages are swallowed 
    logger.debug("clearing messages, coming from " + new Exception().getStackTrace()[1]); 

    Iterator iter = FacesContext.getCurrentInstance().getMessages(); 
    while (iter.hasNext()) { 
     FacesMessage msg = (FacesMessage) iter.next(); 
     logger.debug("clearing message: " + msg.getDetail()); 
     iter.remove(); 
    } 
} 

這裏的缺點是,提交表單和初始化目標頁面的支持bean之間出現的任何錯誤也被吞噬。

+0

謝謝。我嘗試這個'提交按鈕返回按鈕',我仍然有兩個站在彼此的頂部。方法'clearErrorMessages()',你說把它放到目標託管bean的初始化方法中,以及我的目標託管bean有'SessionScoped',所以構造函數只會在應用程序第一次加載時被調用,除非有一些一種註釋來檢測頁面何時重新加載。 – 2010-08-24 21:52:33

相關問題