2012-10-30 55 views
0

我有一個表單有一些輸入有驗證(必需= true) ,當我點擊取消按鈕的情況下驗證錯誤,取消按鈕不導航到上一個頁面,而不是將其刪除驗證錯誤(我認爲它可以追溯到一個步驟是確認錯誤之前?)取消按鈕在驗證錯誤的情況下不起作用

這裏是我的代碼:

<h:form> 

<h:inputText value="#{myBean.nickName}" id="nickname" required="true" 
requiredMessage="nickname should be specified" /> 

<h:commandLink immediate="true" id="cancel_link" onclick="history.back(); return false" style="float: left;margin: 118px 189px 0 0;"> 
<h:graphicImage width="90" height="28" value="#{resource['images:blu_btnCancel.png']}" /> 
</h:commandLink> 

</h:form> 

請告知如何解決這個問題。

回答

2

JavaScript history.back()函數將您帶到上一個同步請求,而不是像您期望的那樣前一個視圖。

即使history.back()可怕的是這種方式(不可靠,容易被破解,等等),速戰速決將發送上形成一個Ajax請求提交,而不是一個同步請求。

<h:form> 
    ... 
    <h:commandButton value="submit"> 
     <f:ajax execute="@form" render="@form" /> 
    </h:commandButton> 
</h:form> 

Ajax請求不會被視爲瀏覽器歷史記錄。

一個更健壯的方法是在導航期間只傳遞前一個視圖的標識符,然後使用<h:link>來鏈接它。例如。

<h:link value="Go to next view" outcome="nextview"> 
    <f:param name="from" value="#{view.viewId}" /> 
<h:link> 

然後在nextview.xhtml

<f:metadata> 
    <f:viewParam name="from" /> 
</f:metadata> 

... 

<h:link ... outcome="#{from}" rendered="#{not empty from}"> 
    <h:graphicImage ... /> 
</h:link> 

如果你通過POST導航時,您可以考慮使用閃光燈範圍記得最初的看法。


無關到具體的問題,使用<h:graphicImage>與JSF2資源的正確方法是隻使用其name屬性,而不是它的value屬性與#{resource}這是平原笨拙。

通過

<h:graphicImage name="images/blu_btnCancel.png" width="90" height="28" /> 

更換注

<h:graphicImage width="90" height="28" value="#{resource['images:blu_btnCancel.png']}" /> 

的庫名images這裏只是路徑名稱所取代。名稱「圖像」作爲圖書館名稱的使用是非常有問題的。另見What is the JSF resource library for and how should it be used?

相關問題