2017-04-05 112 views
3

我正在使用OmniFaces FullAjaxExceptionHandler來顯示錯誤頁面。錯誤頁面顯示正確,但我遇到了這些頁面樣式的問題。h:使用FullAjaxExceptionHandler時不會重新顯示正文

我的應用程序正在使用一個模板,它具有在body元素上定義的CSS類。這些類爲正常的和錯誤頁面是不同的:

正常頁:

<h:body styleClass="main-body layout-compact"> 

錯誤頁面:

​​

當FullAjaxExceptionHandler處理異常,執行到錯誤頁面前進(基於web.xml中的<error-page>機制)。很明顯,這並不會改變<h:body>標記,因爲在檢查HTML輸出時,我可以看到<body>標記仍然包含來自普通頁面(而不是錯誤頁面的類)的CSS類。

看來,原來的<h:body>的內容被替換爲錯誤頁面的內容<h:body>,而不是替換完整的<h:body>。我不知道這是否是默認的JSF/FullAjaxExceptionHandler行爲。

有什麼辦法讓<h:body>呈現正確的CSS類?移動CSS類遠離<h:body>不是一種選擇。

+0

當你做了一個轉發錯誤頁面,那麼它不是一個ajax調用,所以你不能做退回。相反,您正在加載一個新的全新錯誤頁面。請檢查前進是否正確完成。如果是這樣,您將在body標籤上應用正確的CSS。 – OTM

+0

前進是由FullAjaxExceptionHandler正確完成的,我沒有自己做前進。顯示錯誤頁面(在相同的url下),並且整個內容已更改。然而,標籤仍然具有上一頁中的CSS類。所以看起來身體標記不會被重新渲染,而只是其內容。我不知道這是否是標準的JSF行爲。 – baraskae

回答

2

這不幸是「按設計」。在執行AJAX導航時,JSF不會替換整個文檔,但它只會替換單獨的<head><body>元素的子項,而不會影響父項。這是出於歷史原因這樣做的;舊的Internet Explorer版本不支持完全替換它們。

我自己所做的只是簡單地將樣式放入<main>元素中。在最終的HTML輸出中,無論如何,<header><footer>通常都是相同的。基本上是:

<html> 
    <head> 
     <title>...</title> 
    </head> 
    <body> 
     <header>...</header> 
     <main class="#{page.type}">...</main> 
     <footer>...</footer> 
    </body> 
</html> 

如果你真的需要有<body class>修改,那麼最好的辦法是通過嵌入在錯誤頁面模板的JavaScript這樣做。

<h:outputScript rendered="#{faces.ajaxRequest}"> 
    document.body.className = "exception-body error-page"; 
</h:outputScript> 

注:#{faces}僅可自OmniFaces 2.5,如果您使用的是舊版本,請改用#{facesContext.partialViewContext.ajaxRequest})。

+1

謝謝你,再次啓發BalusC!由於在我們的案例中將樣式從身體移開是不可能的,因此您使用嵌入式JavaScript提出的解決方案就像一個魅力! – baraskae

相關問題