0

検証(required = true)を持ついくつかの入力を含むフォームがあり、検証エラーの場合にキャンセルボタンをクリックすると、キャンセルボタンは前のページに移動せず、代わりに検証エラーを削除します(検証エラーの前の1ステップに戻りますか?)

これが私のコードです:

<h:form>

<h:inputText value="#{myBean.nickName}" id="nickname" required="true"
requiredMessage="nickname should be specified" />

<h:commandLink immediate="true" id="cancel_link" onclick="history.back(); return false" style="float: left;margin: 118px 189px 0 0;">
 <h:graphicImage width="90" height="28" value="#{resource['images:blu_btnCancel.png']}" />
</h:commandLink>

</h:form>

それを修正する方法を教えてください。

4

1 に答える 1

2

JavaScripthistory.back()関数を使用すると、予想どおりに前のビューではなく、前の同期リクエストに移動します。

この方法はひどいですhistory.back()が(信頼性が低い、ハッキング可能など)、迅速な解決策は、同期リクエストではなく、フォーム送信時にajaxリクエストを送信することです。

<h:form>
    ...
    <h:commandButton value="submit">
        <f:ajax execute="@form" render="@form" />
    </h:commandButton>
</h:form>

Ajaxリクエストはブラウザの履歴としては考慮されません。

より堅牢な方法は、ナビゲーション中に前のビューの識別子を渡し、それを使用<h:link>してリンクを戻すことです。例えば

<h:link value="Go to next view" outcome="nextview">
    <f:param name="from" value="#{view.viewId}" />
<h:link>

そして、nextview.xhtml

<f:metadata>
    <f:viewParam name="from" />
</f:metadata>

...

<h:link ... outcome="#{from}" rendered="#{not empty from}">
    <h:graphicImage ... />
</h:link>

POSTでナビゲートしている場合は、フラッシュスコープを使用して初期ビューを記憶することを検討してください。


具体的な問題とは関係なく、JSF2リソースで使用する適切な方法<h:graphicImage>、単純に不器用な属性でnameはなく、そのvalue属性を使用することです。#{resource}

交換

<h:graphicImage width="90" height="28" value="#{resource['images:blu_btnCancel.png']}" />

<h:graphicImage name="images/blu_btnCancel.png" width="90" height="28" />

ここでは、ライブラリ名imagesがパス名に置き換えられていることに注意してください。ライブラリ名としての「画像」という名前の使用は非常に疑わしいものです。JSFリソースライブラリとは何ですか?また、どのように使用する必要がありますか?も参照してください。

于 2012-10-31T00:19:45.480 に答える