2017-04-05 5 views
3

OmniFaces FullAjaxExceptionHandlerを使用してエラーページを表示しています。エラーページは正しく表示されますが、これらのページのスタイリングに問題があります。h:FullAjaxExceptionHandlerを使用しているときにボディが再レンダリングされない

私のアプリケーションはbody要素にCSSクラスが定義されたテンプレートを使用しています。これらのクラスは、通常のページとエラーページのために異なっている:

通常のページ:

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

エラーページ:FullAjaxExceptionHandlerが例外を処理

が ​​

、エラーページに転送が実行されます( (web.xml<error-page>メカニズムに基づく)。 HTML出力をチェックすると、<body>タグに(エラーページのクラスではなく)通常のページのCSSクラスがまだ含まれていることがわかるので、これは<h:body>タグを再レンダリングしないことは明らかです。

元の<h:body>の内容は、完全な<h:body>を置き換える代わりに、エラーページ<h:body>の内容に置き換えられているようです。これがデフォルトのJSF/FullAjaxExceptionHandlerの動作であるかどうかはわかりません。

<h:body>を正しいCSSクラスでレンダリングする方法はありますか? <h:body>からCSSクラスを移動することは選択できません。

+0

フォワード・エラー・ページを実行すると、ajaxコールではないので、再レンダリングはできません。代わりに、新しいまったく新しいエラーページをロードしています。転送が正しく行われているかどうかを確認してください。その場合、bodyタグに正しいCSSが適用されます。 – OTM

+0

ForwardはFullAjaxExceptionHandlerによって正しく実行されますが、私は自分で転送を行っていません。エラーページが表示され(同じURLの下に)、の内容全体が変更されます。しかし、タグには、前のページのCSSクラスがあります。ボディータグは再レンダリングされず、内容だけが再レンダリングされるようです。これが標準のJSFの動作であるかどうかはわかりません。 – baraskae

答えて

2

これは残念なことに「設計上」です。 JSFは、ajaxナビゲーションを実行するときにドキュメント全体を置き換えるのではなく、個々の<head>および<body>要素の子要素を置き換え、両親はそのままにします。これは、歴史的な理由から行われます。古いInternet Explorerのバージョンは、それらを完全に置き換えることをサポートしていません。

私が自分でしたのは、代わりにスタイルを<main>要素に置き換えることです。とにかく最後のHTML出力では<header><footer>は通常同じです。基本的には:あなたは本当に<body class>を変更する必要がある場合

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

、その後、あなたの最善の策は、エラーページテンプレートに埋め込まれたJavaScriptを経由して、そうすることです。

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

注:以前のバージョンを使用している場合#{faces}代わりに#{facesContext.partialViewContext.ajaxRequest}を使用し、OmniFaces 2.5以降のみ使用可能です)。

+1

もう一度、啓発の答えBalusCをありがとう!私たちのケースでは、スタイリングを身体から遠ざけることはできないので、埋め込まれたJavaScriptを使用して提案されたソリューションは、魅力的なように機能しています! – baraskae

関連する問題