2013-04-06 43 views
1

在我的web應用程序JSF2(mojarra 2.1.20), 中,頁面上有一個奇怪的行爲,下面的代碼片段:h:commandLink f:當頁面有f:viewParam required =「true」時不會調用ajax動作

<h:commandLink ... action="#{cc.attrs.bean.next}"> 
    <f:ajax execute="@this" render=":#{cc.clientId}" /> 
</h:commandLink> 

動作next()並不總是叫。我發現,這個問題是由於某些原因到URL參數ID相關:

<f:metadata> 
    <f:viewParam name="id" value="#{torneoBean.idParam}" required="true" /> 
</f:metadata> 

當我插入viewParam上面出現問題。但我無法擺脫它。調試ajax請求似乎啓動,成功,完成事件序列被調用(沒有錯誤),渲染的組件被正確渲染,但行動不被觸發。 有沒有辦法調試這種情況,找出問題的根本原因是什麼?

回答

3

顯然你沒有附加<h:message(s)><f:viewParam id="torneo_id">和/或你沒有更新每一個Ajax請求。否則,您會看到一個必需的驗證錯誤。具體問題基本上由commandButton/commandLink/ajax action/listener method not invoked or input value not updated的第3點覆蓋。

至於原因,<f:viewParam>是在每個HTTP請求上執行的,也是在ajax回發上執行的。當發送ajax請求時,當前請求中不再存在所需的請求參數,因此<f:viewParam>未通過所需的驗證。

有幾個解決方案,以這樣的:

  1. 保留請求參數用於通過<f:param>在命令部件的後續請求。

    <h:commandLink ...> 
        ... 
        <f:param name="id" value="#{param.id}" /> 
    </h:commandLink> 
    
  2. 只作一個非回發期間,它要求。這僅在頁面最初由GET請求打開時有效。如果它是由非重定向導航打開的,那麼它仍然會失敗。

    <f:viewParam ... required="#{not facesContext.postback}" /> 
    
  3. 通過JSF工具庫OmniFaces,所述<o:viewParam>提供的一個替換<f:viewParam>。它隱式關閉回發中的required="true",以便您可以繼續使用相同的屬性。

    <o:viewParam ... required="true" /> 
    
+0

感謝BalusC!解決方案#2解決了我的問題,但總的來說,我該如何調試這樣的問題? h:消息肯定可以幫助,但是我可以使用階段偵聽器來解決這個問題(一種錯誤行爲檢測器)以及與未調用的操作有關的所有其他問題嗎? – maxqua72 2013-04-07 06:16:31

+0

記錄當前階段的階段偵聽器確實會暗示更新模型值和調用應用程序階段已被跳過。此外,你還沒注意到JSF記錄了排隊但未顯示的消息嗎?至少,莫哈拉是這麼做的。作爲最後的手段,在'FacesServlet#service()'中放置一個斷點並在那裏推進窗體也應該給出很多見解。你越是這樣做,越瞭解JSF的生命週期,就越容易發現潛在的問題。 – BalusC 2013-04-07 11:31:39

+0

奇怪的是,沒有任何錯誤或警告在日誌中追蹤到排隊和未顯示的消息。日誌很乾淨,這就是爲什麼我要求一種調試方式。這對像這樣的情況會有幫助。 – maxqua72 2013-04-07 12:07:56

相關問題