1

我们有一个跨两个 DIV 的字段的多字段验证器,如果我们尝试跨字段绑定值并将其作为属性传递给其中一个验证器,它不会获得提交的值....字段 phone 3 有一个验证器,但是当它进入验证器时,提交的值是空的。

我有三个 div "phone1" 、 "phone2" 、 "phone3" ,我想在这三个字段中的 "phone3" 字段中进行验证。验证器没有获取左侧和中间字段的提交值。我在 div“phone3”中添加了额外的输入字段“确认”,验证器获取了“确认”字段的值

<div class="home_phone">

        <div id="phone1" >
        <div class="left"></div>
        <div class="middle">
            <h:inputText id="phonePrefix"
                maxlength="4" value="#{phoneNumberTO.phonePrefix}"
                immediate="true"
                binding="#{phonePrefix}">
            </h:inputText>
        </div>
        <div class="right"></div>

</div>
        <div id="phone2" >


        <div class="left"></div>
        <div class="middle">
            <h:inputText  id="phoneAreaCode"
                maxlength="4" 
                immediate="true"
                binding="#{phoneAreaCode}">
            </h:inputText>
        </div>
        <div class="right"></div>
</div>
        <span class="sep_field">-</span>
        <div id="phone3" >

        <div class="left"></div>
        <div class="middle">
            <h:inputText  id="input3"
                maxlength="4" value="#{phoneNumberTO.phoneSuffix}"
                >
                <f:validator validatorId="phoneValidator"  />
                <f:attribute name="phonePrefix" value="#{phonePrefix}"   /> 
             <f:attribute name="phoneAreaCode" value="#{phoneAreaCode}"   />
                             <f:attribute name="confirm" value="#{confirm}"   />
            </h:inputText>
             <h:inputSecret id="confirm" binding="#{confirm}" required="true" />
        </div>
        <div class="right"></div>

</div>



    </div>
4

1 回答 1

2

immediate=true在前两个组件上使用过。否则它将被验证并且提交的值变为 NULL

不,这不是immediate="true"目的。去掉它。

在 JSF 中,组件按照它们出现在 JSF 组件树中的顺序进行处理和转换/验证。在验证阶段,每个输入组件都将逐步转换和验证,如下所示:

  • 获取组件提交的值UIInput#getSubmittedValue()
  • 将组件的提交值转换为临时值。
  • 验证温度值。
    • 如果验证成功,将 temp 值存储为组件的值 byUIInput#setValue() 并将组件的提交值设置为nullby UIInput#setSubmittedValue()
    • 如果验证失败,则丢弃 temp 值并通过传递false给将组件设置为无效UIInput#isValid()。请注意,提交的值保留在组件上!

按照您认为的顺序,在最后一个组件上使用验证器,您应该通过UIInput#getValue()而不是收集其他输入的值,否则当验证成功时UIInput#getSubmittedValue(),您确实会继续获得s 。null

UIInput phonePrefix = (UIInput) component.getAttributes().get("phonePrefix");
Object value = phonePrefix.getValue(); // Don't use getSubmittedValue().

到目前为止,我无法解释为什么将它们放在 div 之外时它会起作用。我认为您实际上意外地重新排列了组件的顺序。


至于属性的正确使用,immediate="true"如果您了解它的确切作用,它应该会有所帮助。以下是调试 JSF 生命周期文章的相关摘录:

好的,我什么时候应该使用 immediate 属性?

如果还不完全清楚,这里有一个总结,其中包含可能有益的真实世界使用示例:

  • 如果UIInput仅在 (s) 中设置,则流程验证阶段将改为在应用请求值阶段进行。使用它来优先验证有UIInput问题的组件。当其中任何一个的验证/转换失败时,非即时组件将不会被验证/转换。

  • 如果UICommand仅设置,则任何组件都将跳过应用请求值阶段直到更新模型值阶段UIInput。使用它跳过表单的整个处理过程。例如“取消”或“返回”按钮。

  • 如果在两个组件中都设置了UIInput,那么对于没有设置此属性UICommand的任何组件,将跳过应用请求值阶段直到更新模型值阶段。UIInput使用它来跳过对某些字段的整个表单的处理(立即)。例如,登录表单中的“忘记密码”按钮带有必填但非即时的密码字段。

于 2012-05-18T18:58:27.953 回答