Как проверить значения мгновенно, но проверить обязательные только при полной отправке?

В настоящее время я добавляю подтверждение в форму. Необходимо проверить две вещи: правильность самого значения (например, является ли оно положительным целым числом или действительным адресом электронной почты) и были ли заполнены все обязательные поля.

Однако, если каким-то образом (f:ajax или IceFaces partialSubmit Атрибут) Я делаю проверку правильности типа сразу (например, когда поле теряет фокус), оно также проверяет required атрибут в этом же шаге. В большинстве случаев это не проблема, поскольку пользователь уже ввел значение и, скорее всего, исправит его, а не вернется к пустому полю.

Однако в случае, когда он действительно хочет очистить поле снова, он больше не может сделать это, не получив ошибку. Следовательно, я хочу проверить только обязательность полей при окончательной отправке страницы.

В настоящее время моя единственная идея разделить два типа проверки состоит в том, чтобы выполнить все обязательные проверки в методе действия базовых компонентов, привязав его, таким образом, непосредственно к окончательному представлению через кнопку.

Есть ли другой способ?

(Для справки: причина, по которой кто-то может захотеть очистить поле снова, заключается в том, что требования могут меняться в зависимости от других вариантов выбора в форме. Поэтому можно решить не предоставлять это поле в конце концов и только после этого исправить параметр, который фактически делает это поле необязательно.)

1 ответ

Решение

Просто позвольте required атрибут оценивать true когда кнопка отправки действительно была нажата.

Ответ, однако, зависит от того, как ваша кнопка отправки выполняет свою логику (стандартно, f:ajax, Лица и т. Д.). Но это в основном сводится к тому, что вы можете проверить карту параметров запроса для параметра запроса, который указывает, что была нажата нужная кнопка отправки.

Например, если это стандартная командная кнопка:

<h:form id="form">
    ...
    <h:commandButton id="submit" value="Submit" action="#{bean.submit}" />
</h:form>

Затем вы можете проверить это, проверив, присутствует ли идентификатор клиента кнопки в карте параметров запроса:

<c:set var="submitButtonPressed" value="#{not empty param['form:submit']}" />
...
<h:inputText ... required="#{submitButtonPressed}" />
<h:inputText ... required="#{submitButtonPressed}" />
<h:inputText ... required="#{submitButtonPressed}" />

Или, если это <f:ajax> кнопка:

<h:form id="form">
    ...
    <h:commandButton id="submit" value="Submit" action="#{bean.submit}">
        <f:ajax execute="@form" ... />
    </h:commandButton>
</h:form>

Тогда вы можете проверить это, проверив, javax.faces.source параметр равен идентификатору клиента кнопки:

<c:set var="submitButtonPressed" value="#{param['javax.faces.source'] == 'form:submit'}" />
...
<h:inputText ... required="#{submitButtonPressed}" />
<h:inputText ... required="#{submitButtonPressed}" />
<h:inputText ... required="#{submitButtonPressed}" />

Вы могли бы даже объединить оба:

<c:set var="submitButtonPressed" value="#{not empty param['form:submit'] or param['javax.faces.source'] == 'form:submit'}" />
...
<h:inputText ... required="#{submitButtonPressed}" />
<h:inputText ... required="#{submitButtonPressed}" />
<h:inputText ... required="#{submitButtonPressed}" />
Другие вопросы по тегам