Как проверить значения мгновенно, но проверить обязательные только при полной отправке?
В настоящее время я добавляю подтверждение в форму. Необходимо проверить две вещи: правильность самого значения (например, является ли оно положительным целым числом или действительным адресом электронной почты) и были ли заполнены все обязательные поля.
Однако, если каким-то образом (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}" />