8

私は次の問題に直面しています: 1 つのページで、アプリケーションのすべてのユーザーを一覧表示し、それぞれに「編集」ボタンがあります。これは、?id=<userid>.

編集ページには<f:viewParam name="id" value="#{editUserBean.id}"/>in メタデータがあります。
入力ミスをして送信した場合 (CDI Weld Bean 検証を使用)、ページは再び表示されますが?id=...、URL の が失われ、編集中のユーザーのユーザー ID が失われます。

JSF validation error, lost valueで説明されている同様の問題を見てきましたが、inputhidden (またはさらに悪いことに、過剰に見える tomahawk) を使用したソリューションには、多くの醜いコードが必要です。

CDIで「会話」を追加しようとしましたが、機能していますが、やり過ぎのように見えます。

検証エラーが発生した場合にビューパラメーターを保持するための簡単なソリューションが JSF に存在しますか?

【私の環境:Tomcat7 + MyFaces 2.1.0 + Hibernate Validator 4.2.0 + CDI(Weld) 1.1.2】

4

5 に答える 5

1

実際にviewパラメータを失うことはありません。f:viewParamはステートフルであるため、URLに含まれていなくても、そこにあります。ビューパラメータにバインドされたセッターにブレークポイントまたはsystem.outを配置するだけです。

(viewParamステートレスステートフルでグーグルすると、さらに情報が見つかります)

于 2011-07-30T22:21:03.797 に答える
0
 <f:metadata>
        <f:viewParam id="id" name="id" value="#{baen.id}"/>
    </f:metadata>

または、初めて URL からパラメーターを取得するときに、それをセッション マップに保存し、そのマップから引き続き使用し、フォームのクリーン マップを保存/更新した後に使用します。

于 2013-12-21T14:00:55.743 に答える
0

これは注意が必要ですが、History API を使用してビュー パラメーターの復元を試みることができます。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
    <f:metadata >
        <f:viewParam name="param1" value="#{backingBean.viewParam1}" />
        <f:viewParam name="param2" value="#{backingBean.viewParam2}" />
        <f:viewAction action="#{view.viewMap.put('queryString', request.queryString)}" />
    </f:metadata>
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <ui:fragment rendered="#{facesContext.postback}" >  
            <script type="text/javascript">
                var url = '?#{view.viewMap.get('queryString')}';
                history.replaceState({}, document.title, url);
            </script>
        </ui:fragment>
        <h:form>
            <h:inputText id="name" value="#{backingBean.name}" />
            <h:message for="name" style="color: red" />
            <br />
            <h:commandButton value="go" action="#{backingBean.go}" />
        </h:form>
        <h:messages globalOnly="true" />
    </h:body>
</html>
于 2016-04-04T02:00:04.103 に答える
0

私のアプリケーションでも同じです。より洗練された実装を可能にする @ViewAccessScoped に切り替えました。

于 2011-08-21T19:20:29.273 に答える