0

SEAM ベースの JSF Web アプリケーションを使用しています。カテゴリ名と ID を取得するルックアップ (ポップアップ ウィンドウ) を含む単純なフォームがあります (どちらも問題なく取得され、myView に保存されます)。ルックアップが返されると、カテゴリ名を使用して「selectedCategoryName」が設定されます (Jquery を使用)。

フォームを送信しようとしたときに問題が発生し、別のフィールドが検証に失敗しました (単純な必須フィールドがありません)。他のすべてのフィールドは変更されませんが、selectedCategoryName はクリアされます (Bean にはまだ値があるため、検証エラーを修正して再送信すると適切な送信に解決されます)。私の質問は、フォームの検証が失敗したときに「selectedCategoryName」にある値を表示し続けるにはどうすればよいですか?

前もって感謝します!

<s:decorate id="selectedCategoryField" template="/layout/edit.xhtml">
<span>
    <h:panelGroup rendered="#{! myView.persisted}">
    <img class="lookup" src="${request.contextPath}/images/lookup.gif" width="15" height="14" alt="" 
                        title="Category Lookup" 
                        onclick="return openNewWindow('${CategoryLookupUrl}?#{myView.lookupParameters}', 'id');"/>
    </h:panelGroup>

            <h:inputText id="selectedCategoryName" required="true" 
                        value="#{myView.selectedCategoryName}" 
                        size="50" 
                        readonly="true">

            <a:support event="onchanged" reRender="selectedCategoryField" ajaxSingle="true"/>
    <a:support event="oninputchange" reRender="selectedCategoryField" ajaxSingle="true"/>
            </h:inputText>
    </span>

4

1 に答える 1

2

問題は、実際には Bean が のために選択された値を保持しないことですreadonly="true"。そのプロパティを UIInput に適用すると、UIInput は送信時に処理されません。

これを修正するには、次のようにします。
JSF2 を使用している場合は、readonly="#{facesContext.renderResponse}"代わりに使用できます。そうでない場合は、バッキング Bean で
メソッドを定義し、を使用します。isReadonlyreadonly="#{myView.isReadonly}"

public boolean isReadonly() {
    return FacesContext.getCurrentInstance().getRenderResponse();
}

これが機能する理由の詳細については、次の同様の質問と特に回答をご覧ください。 コマンド ボタンがクリックされると <h:inputText readonly="true"> のデータが消える

于 2013-08-28T08:39:27.317 に答える