使用动态ID验证两个组件

时间:2015-02-05 16:58:01

标签: validation jsf

这是我要做的事情:
我有一个包含多对输入字段和一个保存按钮的表单 按下保存按钮时,如果它们是数字且左侧值小于正确值,则应验证每对输入字段。
如果不是,则会显示验证错误,如果是这种情况,则会弹出一个对话框,询问应该保存的名称。

这是我到目前为止所得到的:

<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' &amp;&amp; !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/

教程的最大值

Variant 1在验证完成后添加一个侦听器,并且能够添加浏览器中显示的错误消息。但这并不算作验证失败,也不设置facesContext.validationFailed标志。

Variant 2为一个组件编写自定义验证器,并将另一个组件作为该验证器的参数。这看起来像这样:

    <f:validator validatorId="myValidator" />
    <f:attribute name="maximum" value="#{max#{elem.id}}" />

这不是真正有效的EL,我不知道如何正确写它。

我该怎么做才能验证每个min-max对是否有效

1 个答案:

答案 0 :(得分:1)

此处您不需要#{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,那么您可以使用其<o:validateOrder>代替。

<h:inputText id="min" value="#{elem.minimum}" />
<h:inputText id="max" value="#{elem.maximum}" />
<o:validateOrder components="min max" showMessageFor="min" />

另见: