使用动态 id 验证两个组件
Validate two components with dynamic id
这是我正在尝试做的事情:
我有一个包含多对输入字段和一个保存按钮的表单。
当按下保存按钮时,应验证每对输入字段是否为数字以及左侧值是否小于右侧值。
如果不是,将显示验证错误,如果是这种情况,将弹出一个对话框,询问应保存的名称。
这是我目前得到的:
<h:form>
<ui:repeat value="#{myBean.someList}" var="elem">
<h:inputText id="min#{elem.id}" value="#{elem.minimum}" />
<h:inputText id="max#{elem.id}" value="#{elem.maximum}" />
<br />
<h:message for="min#{elem.id}" style="color:red" />
<h:message for="max#{elem.id}" style="color:red" />
</ui:repeat>
<h:commandButton value="save">
<f:ajax execute="@form" render="@form updateValidationFailedFlag"
onevent="
function(ajaxResult){
if(ajaxResult.status=='success' && !globalValidationFailedFlag)
showSaveDialog();
}"
/>
</h:commandButton>
<h:outputScript id="updateValidationFailedFlag">
globalValidationFailedFlag = #{facesContext.validationFailed};
</h:outputScript>
</h:form>
这有效,但不检查最小值是否小于最大值。
它将验证输入(检查输入是否为整数)并在未发生验证错误时显示保存对话框。
为了检查最小值是否小于最大值,我尝试按照 http://www.mkyong.com/jsf2/multi-components-validator-in-jsf-2-0/
上的教程进行操作
变体 1 在验证完成后添加一个侦听器,并且能够添加在浏览器中显示的错误消息。但这不算作验证失败,也没有设置 facesContext.validationFailed 标志。
变体 2 为一个组件编写自定义验证器,并将另一个组件作为参数提供给该验证器。那看起来像这样:
<f:validator validatorId="myValidator" />
<f:attribute name="maximum" value="#{max#{elem.id}}" />
那不是真正有效的 EL,我不知道如何正确地写它。
我可以做些什么来验证每个最小-最大对是否有效
这里不需要#{elem.id}
。 <ui:repeat>
已经解决了这个问题。当 JSF 需要设置 id
属性时,它将被评估为一个空字符串。
<ui:repeat value="#{myBean.someList}" var="elem">
<h:inputText id="min" value="#{elem.minimum}" />
<h:inputText id="max" value="#{elem.maximum}" />
<br />
<h:message for="min" style="color:red" />
<h:message for="max" style="color:red" />
</ui:repeat>
至于验证,只需传递其他组件的值即可:
<h:inputText id="min" binding="#{min}" value="#{elem.minimum}" />
<h:inputText id="max" value="#{elem.maximum}">
<f:validator validatorId="myValidator" />
<f:attribute name="min" value="#{min.value}" />
</h:inputText>
请注意,我将验证器移至第二个组件。否则,如果第二个组件未通过转换,它仍会被调用。
如果您碰巧使用了 JSF 实用程序库 OmniFaces, then you could use its <o:validateOrder>
。
<h:inputText id="min" value="#{elem.minimum}" />
<h:inputText id="max" value="#{elem.maximum}" />
<o:validateOrder components="min max" showMessageFor="min" />
另请参阅:
- How to use EL with <ui:repeat var> in id attribute of a JSF component
- JSF doesn't support cross-field validation, is there a workaround?
这是我正在尝试做的事情:
我有一个包含多对输入字段和一个保存按钮的表单。
当按下保存按钮时,应验证每对输入字段是否为数字以及左侧值是否小于右侧值。
如果不是,将显示验证错误,如果是这种情况,将弹出一个对话框,询问应保存的名称。
这是我目前得到的:
<h:form>
<ui:repeat value="#{myBean.someList}" var="elem">
<h:inputText id="min#{elem.id}" value="#{elem.minimum}" />
<h:inputText id="max#{elem.id}" value="#{elem.maximum}" />
<br />
<h:message for="min#{elem.id}" style="color:red" />
<h:message for="max#{elem.id}" style="color:red" />
</ui:repeat>
<h:commandButton value="save">
<f:ajax execute="@form" render="@form updateValidationFailedFlag"
onevent="
function(ajaxResult){
if(ajaxResult.status=='success' && !globalValidationFailedFlag)
showSaveDialog();
}"
/>
</h:commandButton>
<h:outputScript id="updateValidationFailedFlag">
globalValidationFailedFlag = #{facesContext.validationFailed};
</h:outputScript>
</h:form>
这有效,但不检查最小值是否小于最大值。 它将验证输入(检查输入是否为整数)并在未发生验证错误时显示保存对话框。
为了检查最小值是否小于最大值,我尝试按照 http://www.mkyong.com/jsf2/multi-components-validator-in-jsf-2-0/
上的教程进行操作变体 1 在验证完成后添加一个侦听器,并且能够添加在浏览器中显示的错误消息。但这不算作验证失败,也没有设置 facesContext.validationFailed 标志。
变体 2 为一个组件编写自定义验证器,并将另一个组件作为参数提供给该验证器。那看起来像这样:
<f:validator validatorId="myValidator" />
<f:attribute name="maximum" value="#{max#{elem.id}}" />
那不是真正有效的 EL,我不知道如何正确地写它。
我可以做些什么来验证每个最小-最大对是否有效
这里不需要#{elem.id}
。 <ui:repeat>
已经解决了这个问题。当 JSF 需要设置 id
属性时,它将被评估为一个空字符串。
<ui:repeat value="#{myBean.someList}" var="elem">
<h:inputText id="min" value="#{elem.minimum}" />
<h:inputText id="max" value="#{elem.maximum}" />
<br />
<h:message for="min" style="color:red" />
<h:message for="max" style="color:red" />
</ui:repeat>
至于验证,只需传递其他组件的值即可:
<h:inputText id="min" binding="#{min}" value="#{elem.minimum}" />
<h:inputText id="max" value="#{elem.maximum}">
<f:validator validatorId="myValidator" />
<f:attribute name="min" value="#{min.value}" />
</h:inputText>
请注意,我将验证器移至第二个组件。否则,如果第二个组件未通过转换,它仍会被调用。
如果您碰巧使用了 JSF 实用程序库 OmniFaces, then you could use its <o:validateOrder>
。
<h:inputText id="min" value="#{elem.minimum}" />
<h:inputText id="max" value="#{elem.maximum}" />
<o:validateOrder components="min max" showMessageFor="min" />
另请参阅:
- How to use EL with <ui:repeat var> in id attribute of a JSF component
- JSF doesn't support cross-field validation, is there a workaround?