ボタンをクリックすると、Webフォーム全体を送信しない方法はありますか?

StackOverflow https://stackoverflow.com/questions/3560459

  •  01-10-2019
  •  | 
  •  

質問

私はできるだけ短くしようとします、ここに私と一緒にいてください

「a.jsf」 - >マネージドビーン: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」 - >マネージドビーン:Bean2

 ...
 <p:growl id="msgs" showDetail="true"/>
 ...

アップロード]をクリックすると、「アップロードする許可がありません」といううなり声エラーメッセージが表示されます。これは良いことです。しかし、その後、b.jsfに連れて行ってくれる「バック」をクリックすると、「アップロードする許可がない」といううなり声のメッセージが表示されます。また。起こっているように見えることは、「戻る」をクリックすると、アップロードするために他のフォームリクエストを送信し、同じエラーメッセージが生成され、B.JSFで表示されます。 「戻る」ボタンを空のフォームに入れることに加えて、これを修正する方法はありますか?私はこれをやろうとしています:

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

ID = "TOM"でコンポーネントに送信されることを期待して、ID = MSGSでうなり声が負荷を取得することはありませんが、運はありません。私は向きを変えようとします upload クリックするとフラグが付けられます Back ボタンですが、Webフォームは、 back ナビゲーションが呼び出されます。

それは私がそれを望んでいるほど短くないので、私はそれについて謝罪したいです:D

役に立ちましたか?

解決

「戻る」ボタンを空のフォームに置くことに加えて、今では2つのボタンがお互いの上に立っているので

HTML <form> デフォルトではa ブロック要素. 。 HTMLブロック要素は、デフォルトで新しいラインに配置されます。あなたは実際にそれを作りたいです インライン要素. 。これを使用することができます display: inline; CSSで。

実際の問題に戻ると、それは私が fileUploadListener 方法にもかかわらず、メソッドが呼び出されます immediate="true" の中に p:commandButton. 。私はこれを再現しようとしました、そして私はこれを確認することができます。しかし、私はそれが起こるとは思わないでしょう。 通常は immediate="true" ボタン上 「全体」フォームの送信をスキップするソリューション(少なくとも、スキップ UIInput この属性のないコンポーネント)。さらなる調査は私を学びました p:fileUpload ではありません UIInput コンポーネントはまったく、リスナーが検証またはモデル値フェーズを更新する代わりに、適用要求値フェーズ中に発射されること。したがって、この動作は完全に予測可能ですが、IMOはまだ設計の監視です。

以来 p:fileUpload 必要 ajax="false"p:commandButton 一方、コンポーネントは、バックボタンからそれを削除して、Ajaxicalリクエストを発射し、これによりスキップすることもできます。 fileUploadListener 呼ばれる。

他のヒント

実際、ボタンを別の形に置くと、優れたソリューションのように聞こえます。ボタンがこれ以上揃っていない理由は、新しいスタートが <form> 要素は独自のラインで始まります。追加することでこれを防ぐことができるはずです form { display: inline; } CSSファイルに。

とはいえ、削除したい残りのエラーメッセージがある場合は、バッキングビーンの初期化方法でこれを行うことができます(持っている場合)。以下の作品は青白くなります:

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();
    }
}

ここでの不利な点は、フォームの送信とターゲットページのバッキングビーンの初期化との間に発生するエラーも飲み込まれていることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top