ボタンをクリックすると、Webフォーム全体を送信しない方法はありますか?
-
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();
}
}
ここでの不利な点は、フォームの送信とターゲットページのバッキングビーンの初期化との間に発生するエラーも飲み込まれていることです。