【问题标题】:Bypass JSF validation for a UIInput component绕过 UIInput 组件的 JSF 验证
【发布时间】:2010-12-13 23:25:22
【问题描述】:

这是问题所在,JSF 验证不断将字段翻转回最后一个已知值。

我们正在编辑一个支持 bean 已经具有值的页面。 (频率 = “每周”)

我们需要显示“请选择..”的默认值,即使该值不会通过验证(是的,我只想让用户留在页面上并显示错误消息)。

有什么方法可以让用户选择“Select..”而不是重置为最后一个好的值?

显然不允许用户保存,但我们希望保留他们的无效值。

  1. 用户添加新对象,从下拉列表中选择合适的值
  2. 用户保存成功。
  3. 用户单击“编辑”并显示具有已知值的对象(“每周”)
  4. 用户将“每周”更改为“选择”
  5. 用户点击保存
  6. 显示验证消息(很好),但频率回到最后一个值“每周”(不好,我需要它保持在“请选择..”并让用户手动修复下拉菜单。

immediate="true" 对 inputComponents 不起作用,仅对 commandComponents 起作用。

【问题讨论】:

    标签: validation jsf jsf-2


    【解决方案1】:

    我知道这一点,我在一年多前以JSF issue 1299 报告了这一点。这仍然没有解决,因为它的优先级很低。这并不特定于所有UIInput 组件,而是特定于MenuRenderer,它负责呈现HTML <select> 元素。所有其他 HTML 输入元素的行为都如您所愿,提交的值将被重新显示(好吧,实际上也没什么)。

    由于您已经在使用 JSF 2.0,我建议您通过 f:ajax 的一点帮助来解决这个问题,这样下拉菜单就不会被重新呈现,从而保持其选择。

    <h:selectOneMenu id="frequency" value="#{bean.frequency}" required="true">
        <f:selectItems value="#{bean.frequencies}" />
        <f:ajax render="frequencyMessage" />
    </h:selectOneMenu>
    <h:message id="frequencyMessage" for="frequency" />
    

    额外的好处是最终用户可以获得即时反馈,这对用户体验更好。

    【讨论】:

    • 谢谢巴鲁斯!我玩了一下,但是一旦用户单击“提交”,该值仍会恢复,不是吗?还是在提交后重新渲染整个页面时,该渲染是否也适用(我认为不会)
    • 也可以使用 ajax。将&lt;f:ajax/&gt; 放入h:commandButton,如有必要,在消息ID 上加上render
    • 这是一个方便的实时反馈技巧,并立即显示他们的错误。但即使在我的命令按钮中使用 ajax 并带有 render="messageList"(我在按钮上方使用单个消息框),保存操作仍会将 messageList 翻转回预验证值。 .....也许我会让实时消息显示“此值是必需的,如果未设置将返回之前的值”
    猜你喜欢
    • 1970-01-01
    • 2013-08-04
    • 2014-11-25
    • 2015-03-17
    • 1970-01-01
    • 2011-05-19
    • 2011-10-04
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多