Представление не может быть восстановлено после нажатия кнопки, которая запускает функцию JS, которая очищает форму - PullRequest
0 голосов
/ 03 февраля 2012

У меня проблема с формой, которая у меня есть. Форма позволяет пользователям вводить информацию в некоторые текстовые поля, а затем есть 2 кнопки - Поиск и Сброс.

Код формы:

<h:outputText value="Search by Author Name" styleClass="p" />

<div class="investigatorTab">

    <h:outputLabel for="firstName" rendered="true" value="First Name" />
    <h:inputText value="#{pubBacker.firstName}"></h:inputText>

    <h:outputLabel for="lastName" rendered="true" value="Last Name" />
    <h:inputText value="#{pubBacker.lastName}"></h:inputText>

</div>

<div class="buttons">
    <p:commandButton value="Submit" styleClass="submitButton" action="#{pubBacker.submit}" update="tabs" />
    <p:commandButton value="Reset" type="button" actionListener="#{pubBacker.clearEntries}" onclick="clearForm(this.form);" />
</div>

Проблема, с которой я столкнулся, заключается в том, что, если я нажму кнопку поиска, она перейдет на страницу результатов, а если я вернусь на страницу поиска, она все еще содержит данные, которые я искала в текстовых полях, потому что бин является сессионной областью. Я хочу иметь возможность нажать кнопку «Сброс» и очистить данные в текстовых полях.

В настоящее время с кодом ниже, если я нажимаю кнопку «Сброс», кнопка поиска больше не работает, и в консоли firebug выдает эту ошибку

<?xml version='1.0' encoding='UTF-8'?>
<partial-response><error><error-name>class javax.faces.application.ViewExpiredException</error-name><error-message><![CDATA[viewId:/ccadmin/pubManagement.xhtml - View /ccadmin/pubManagement.xhtml could not be restored.]]></error-message></error></partial-response>

Если я удаляю onclick="clearForm(this.form);" из второго p:commandButton, форма работает нормально.

Есть идеи, почему вызов JS-функции может привести к истечению срока действия представления?

Публикация Bean:

@ManagedBean(name="pubBacker")
@SessionScoped
public class Publication {

    public Publication() {}

    public void clearEntries() {
        new Publication();
    }
}

1 Ответ

1 голос
/ 03 февраля 2012

Вы, очевидно, очищаете все элементы формы, вслепую просматривая form.elements. Таким образом, поле скрытого ввода javax.faces.ViewState, которое автоматически включается JSF, также будет очищено, и, следовательно, JSF получит пустое значение и не сможет найти связанное состояние просмотра на стороне сервера. Это в конечном итоге приведет к ViewExpiredException.

Я предлагаю просто не использовать JS для очистки формы, а только JSF. Это проще, если у вас есть модель, которая представляет форму.

<div class="investigatorTab">
    <h:outputLabel for="firstName" rendered="true" value="First Name" />
    <h:inputText value="#{pubBacker.pub.firstName}"></h:inputText>

    <h:outputLabel for="lastName" rendered="true" value="Last Name" />
    <h:inputText value="#{pubBacker.pub.lastName}"></h:inputText>
</div>

<div class="buttons">
    <p:commandButton value="Submit" styleClass="submitButton" action="#{pubBacker.submit}" update="tabs" />
    <p:commandButton value="Reset" action="#{pubBacker.clear}" process="@this" update="@form" />
</div>

(обратите внимание на process="@this", это не будет обрабатывать входные значения формы и, следовательно, не проверять их)

с

public void clear() {
    pub = new Pub();
}
...