6

できるだけ簡潔にお伝えしますので、お付き合いください

"A.jsf" -> 管理対象 Bean : bean "#{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 に表示されます。「戻る」ボタンを空のフォームに配置する以外に、これを修正する方法はありますか?これは、2 つのボタンが並んでいるのではなく、互いの上に立っているためです。私はこれをしようとします:

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

id="tom" を指定してコンポーネントに送信することを期待していたので、id=msgs を指定したうなり声はロードされませんが、うまくいきませんでした。uploadボタンをクリックしたときにフラグをオンにしようとしましたが、ナビゲーションBackを処理するメソッドが呼び出される前に Web フォームが要求されます。back

私が望んでいるほど簡潔ではありませんので、お詫び申し上げます:D

4

2 に答える 2

5

「戻る」ボタンを空のフォームに配置するだけでなく、2 つのボタンが重なり合っているためです。

HTML<form>はデフォルトでブロック要素です。HTML ブロック要素は、デフォルトで新しい行に配置されています。実際にはインライン要素にしたいと考えています。display: inline;CSSを使用してこれを行うことができます。

実際の問題に戻るfileUploadListenerimmediate="true"p:commandButton. これを再現しようとしましたが、これを確認できます。しかし、私はそれが起こるとは思っていませんでした。通常immediate="true"ボタンの、「全体」フォームの送信をスキップする解決策です (少なくとも、UIInputこの属性のないコンポーネントをスキップします)。さらに調査したところ、p:fileUploadUIInputコンポーネントではなく、検証またはモデル値の更新フェーズではなく、リクエスト値の適用フェーズでリスナーが起動されることがわかりました。したがって、この動作は完全に予測可能ですが、まだ設計上の見落としがあります。

はコンポーネントにp:fileUpload必要なので、一方、戻るボタンから削除して、ajaxical リクエストを起動し、呼び出されるのをスキップすることもできます。ajax="false"p:commandButtonfileUploadListener

于 2010-08-25T01:13:31.110 に答える
2

実際、ボタンを別の形にすることは優れた解決策のように思えます。ボタンが整列しなくなった理由は、新しい開始<form>要素が独自の行から始まるためです。form { display: inline; }CSS ファイルに追加することで、これを防ぐことができるはずです。

そうは言っても、取り除きたいエラーメッセージが残っている場合は、バッキング Bean の初期化メソッドでこれを行うことができます (バッキング Bean がある場合)。以下はピーチリーに機能します:

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 の初期化の間に発生したエラーも飲み込まれることです。

于 2010-08-24T20:15:11.677 に答える