0

私はシンプルなフォームを持っています。

<h:form>
   <h:selectOneMenu value="#{user.siteID}" >
       <f:selectItems id="vals" value="#{user.basinSiteIDs}" /> 
       <f:ajax event="valueChange" listener="#{user.updateWithAjax(e)}"
                render="all" />
   </h:selectOneMenu>
   <h:selectManyCheckbox id="all" value="#{user.siteIDs}" layout="pageDirection">
       <f:selectItems id="sites" value="#{user.csrpSites}" />
   </h:selectManyCheckbox>
   <h:commandButton value="submit" action="result"/>
</h:form>

ページは、最初に、関連する値を含むドロップダウンとチェック ボックスをロードします。ドロップダウンから選択すると、チェック ボックスの値が ajax で動的に変更されます。送信ボタンをクリックして、ユーザーが選択した値を結果ページに表示する必要があります。

問題は次のとおりです。 を使用@RequestScopedすると、送信ボタンをクリックすると が表示されますj_idt7:all: Validation Error: Value is not valid

@ViewScoped、結果ページが表示されますが、値は空/null です。

@SessionScoped、正しい値の結果ページを表示しますが、ブラウザーの戻るボタンをクリックしてインデックス ページに移動すると、値が表示されなくなります。これは IE と Chrome でのみ発生し、Firefox では発生しません。

4

1 に答える 1

0

これ@ViewScopedは、ajax によって入力される依存ドロップダウンリストを持つための適切なスコープです。あなたの具体的な問題は、何らかの理由で同じビュースコープのBeanを2つの物理的に異なるビューにバインドすることによって引き起こされます。ビュー スコープ Bean は、ビュー自体が存続する限り存続します。ビューを変更すると、新しいビュー スコープ Bean が得られます。結果を同じビューに表示していれば、問題なく機能していたはずです。

物理的に異なる 2 つのビューという奇妙なアプローチを本当に維持する必要がある場合は、Bean を 2 つに分割することをお勧めします。

<h:selectOneMenu id="basin" value="#{user.basinSiteID}" >
    <f:selectItems value="#{data.basinSiteIDs}" /> 
    <f:ajax listener="#{data.loadCsrpSiteIDs}" render="csrp" />
</h:selectOneMenu>
<h:selectManyCheckbox id="csrp" value="#{user.csrpSiteID}" layout="pageDirection">
    <f:selectItems value="#{data.csrpSiteIDs}" />
</h:selectManyCheckbox>
<h:commandButton value="submit" action="result"/>

(ここでいくつかの改善を行ったことに注意してください。最初のコードは多少汚れていて、特に ajax 動作イベントを渡す試みは完全に間違っていますnull

ここ#{user}ではリクエストスコープであり、#{data}ビュースコープです。

以下も参照してください。

于 2013-08-07T11:43:39.850 に答える