【问题标题】:JSF/Richfaces/A4j ==> component/field conversion and reRendering problemJSF/Richfaces/A4j ==> 组件/字段转换和重新渲染问题
【发布时间】:2011-07-12 23:51:44
【问题描述】:

我在 JSF 页面中有一个输入字段,如下所示(映射到支持 bean 上的 BigDecimal)

    <h:inputText disabled="#{volumeBean.grossVolumeDisabled}" id="grossVolume" size="10" validateOnExit="true" value="#{volumeBean.enteredGrossVolume}" >
    <a4j:support ajaxSingle="true" event="onblur" ignoreDupResponses="true" oncomplete="checkFieldValidation(this)" onsubmit="updateDirty()"/>
    </h:inputText>

还有一个 a4j:commandButton 用于“刷新”页面上数据库中的所有数据:

    <a4j:commandButton accesskey="T" action="#{volumeBean.revert}" button-type="ajax" disabled="#{volumeBean.revertDisabled}" id="volumeBean_reset"         immediate="true" reRender="volumesTable" value="#{msg.button_RESET}"/>

以下是重现我的问题的步骤: 并且请注意无论是否在a4j上设置了reRender属性都会出现错误:support

这里是重现的步骤 - 只是为了进一步澄清:

  1. 导航到存在 BigDecimal 输入字段的屏幕
  2. 在字段中输入 aa(应该是数字,但故意输入非数字字符)
  3. 标签关闭字段
  4. 注意报错'aa' is not a valid netVolume
  5. 点击重置按钮
  6. 所有更改的字段都有其原始值,但输入了非数字数据的字段除外
  7. 除非用户手动删除字段中的非数字数据或刷新整个屏幕,否则“坏数据”会粘住

【问题讨论】:

    标签: jsf richfaces lifecycle rerender


    【解决方案1】:

    当您进行重置时,您会触发一个 Ajax 请求,提交整个表单并再次收到验证错误。所以该字段仍然具有旧的(不正确的)值。

    【讨论】:

    • 重置按钮有'immediate="true"',所以它应该绕过验证。
    • 由于会话失败,组件中的提交值中保存了不正确的值。你是对的,当 immediate="true" 时不处理对话/验证,但是在呈现页面时,使用来自 submitValue 的值。您需要清除提交的值。
    • 如何自动或以编程方式清除提交的值?
    • 查看JSF API,component.getSubmittedValue()
    【解决方案2】:

    尝试将参数ajaxSingle="true" 添加到按钮。我发现immediate="true" 不足以绕过对 ajax 组件的验证。

    【讨论】:

    • ajaxSingle 不会跳过验证。就是只处理当前组件,也就是经过JSF生命周期。
    • 我尝试使用 ajaxSingle="true" - 没有用。该值仍然以某种方式缓存在客户端。
    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 2023-04-09
    • 1970-01-01
    • 2011-02-06
    • 2014-05-19
    • 1970-01-01
    • 2020-12-22
    • 2011-10-08
    相关资源
    最近更新 更多