问题在于,JSF 验证不断地将字段翻转回最后一个已知值。
我们正在编辑一个页面,其中支持 bean 已经具有值。 (频率=“每周”)
我们需要显示默认值“please select..”,即使该值不会通过验证(是的,我只是想让用户留在带有错误消息的页面上)。
有什么方法可以让用户选择“Select..”而不将其重置为最后一个好的值?
显然不允许用户保存,但我们希望保留其无效值。
- 用户添加新对象,从下拉列表中选择适当的值
- 用户保存成功。
- 用户点击“编辑”并显示具有已知值的对象(“每周”)
- 用户将“每周”更改为“选择”
- 用户点击“保存”
- 显示了验证消息(很好),但频率返回到最后一个值“每周”(不好,我需要它保持在“请选择..”并让用户手动修复下拉菜单。
immediate="true"不适用于 inputComponents,仅适用于 commandComponents。
最佳答案
我认识到这一点,一年多前我已将此报告为 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" />
额外的好处是最终用户可以获得即时反馈,这有利于用户体验。
关于validation - 绕过 UIInput 组件的 JSF 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4434490/