0

私はJSF2とRichfaces4を使用するJavaEEアプリケーションで作業しています。モーダルウィンドウを使用していくつかの対話を行うことを決定し、このプロジェクトですでにJquery UIを使用していたため、h:formを使用したJqueryUIダイアログを選択しました。

ダイアログが正しく開かれ、フォームが送信されます。送信はah:commandButtonとa4j:ajaxを使用して行われます。h:commandButtonは非表示のままで、ダイアログボタンによってトリガーされます。

すべてが完璧に見えますが、ダイアログ/フォームは1回だけ機能します。ページを更新せずにダイアログを閉じて開くと、フォームを送信したときにメッセージが表示されます。

javax.faces.application.ViewExpiredException:viewId:/frontend/inicial.xhtml-/frontend/inicial.xhtmlを復元できませんでした

ダイアログのJSF/HTML:

<h:panelGroup  id="dialog-nova-intercorrencia" styleClass="ui-dialog-content ui-widget-content">
    <h:form id="frm-dialog-nova-intercor" prependId="false">          
        <table>
            <tr>
                <td>Paciente</td>
                <td>
                    <h:selectOneMenu id="sel-intern-intercor" value="#{intercorrenciaController.novaIntercorrencia.internacao.internacaoID}"  styleClass="ui-widget-content ui-corner-all">
                        <f:selectItems value="#{internacaoController.listInternacoesSelectItem}" />
                    </h:selectOneMenu>
                </td>
            </tr>
            <tr>
                <td>Impacto</td>
                <td>
                    <h:selectOneMenu id="sel-impacto" value="#{intercorrenciaController.novaIntercorrencia.impacto.impactoID}"  styleClass="ui-widget-content ui-corner-all">
                        <f:selectItems value="#{intercorrenciaController.listaImpactosSelectItem}" />
                    </h:selectOneMenu>                        
                </td>
            </tr>
            <tr>
                <td>
                    Data e Hora
                </td>
                <td>
                    <h:inputText value="#{intercorrenciaController.dataIntercorrencia}" styleClass="ui-widget-content ui-corner-all" style="width: 130px" />
                    &#160;
                    <h:inputText value="#{intercorrenciaController.horaIntercorrencia}" styleClass="ui-widget-content ui-corner-all" style="width: 70px" />
                </td>
            </tr>
            <tr>
                <td>Resumo</td>
                <td><h:inputText value="#{intercorrenciaController.novaIntercorrencia.resumo}" size="25" styleClass="ui-widget-content ui-corner-all" /></td>
            </tr>
            <tr>
                <td colspan="2">
                    Comentarios
                    <br />
                    <h:inputTextarea cols="30" rows="3" value="#{intercorrenciaController.novaIntercorrencia.descricao}" />
                </td>
            </tr>                
        </table>
        <h:commandButton id="btt-add-nova-intercor" action="#{intercorrenciaController.cadastrarIntercorrencia}" style="display:none">
            <a4j:ajax execute="@form" render="@form frm-dialog-nova-intercor panel-lista-intercorrencias" />
        </h:commandButton>
    </h:form>
</h:panelGroup>

jQuery UIダイアログを作成するためのJS:

    $("#dialog-nova-intercorrencia").dialog({
        position: {
            my: "top top", 
            at: "top top", 
            of: window
        },
        autoOpen: false,
        height: 350,
        width: 400,
        draggable: false,
        resizable: false,
        modal: true,
        buttons: {
            "Cadastrar": function() {
                $("#btt-add-nova-intercor").trigger("click");
            },
            "Cancelar": function() {
                $( this ).dialog( "close" );
                $(this).find("input").val("");
                $(this).find("textarea").val("");
                $(this).find("select").val(0);                                
            }
        },
        close: function() {
            $(this).find("input").val("");
            $(this).find("textarea").val("");
            $(this).find("select").val(0);
        }
    }); 

ダイアロンでフォームを1回だけ実行でき、2回目に「ビューを復元できませんでした」というメッセージが表示される理由を誰かが知っていますか?

4

1 に答える 1

0

問題は、ダイアログを閉じる前にフィールドをクリアするために使用していたJSでした。

$(this).find("input").val("");

これは、入力の非表示のjavax.faces.ViewStateをnullの形式で設定していました。

<input type="hidden" name="javax.faces.ViewState" value="" />
于 2013-03-23T13:18:09.097 に答える