我目前正在为表单添加验证。有两件事需要检查:值本身的正确性(例如,如果它是正整数或有效的电子邮件)以及是否填写了所有必填字段。
然而,如果通过某种方式(f:ajax
或IceFaces partialSubmit
属性),我立即进行类型正确性验证(例如,当字段失去焦点时),它也会在同一步骤中检查required
属性。在大多数情况下,这是没有问题的,因为用户已经输入了一个值,并且可能会更正它,而不是返回到空白字段。
然而,在他真的想再次清理场地的情况下,他再也无法做到这一点而不出现错误。因此,我只想在最终提交页面时检查所需字段的数量。
目前,我将这两种验证类型分开的唯一想法是在backingbeans操作方法中执行所有必需的检查,从而将其直接绑定到最终的submit via按钮。
还有别的办法吗?
(对于背景:人们可能想再次清除该字段的原因是,根据表单中的其他选择,要求可能会发生变化。因此,人们可能会决定根本不提供该字段,只有在这之后,才能更正使该字段成为可选字段的选项。)
当真正按下提交按钮时,只需让required
属性评估true
即可。
然而,答案取决于提交按钮执行其逻辑的方式(标准、f:ajax
、ICEfaces等)。但它基本上可以归结为,您可以在请求参数映射中检查一个请求参数,该参数指示所需的提交按钮已被按下。
例如,如果是标准命令按钮:
<h:form id="form">
...
<h:commandButton id="submit" value="Submit" action="#{bean.submit}" />
</h:form>
然后,您可以通过检查按钮的客户端ID是否存在于请求参数映射中来进行检查:
<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
参数是否等于按钮的客户端ID:来进行检查
<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}" />