必填字段跳过对用户输入的反应

required fields skip reactions to user input

如果表单中有空 required 字段,它们会阻止我通过代码设置值和 hide/show 其他字段,具体取决于当前用户输入。 我将我的问题分解为一个小例子:

<h:inputText label="Name" value="#{req.test}" required="true"/>
<h:inputText label="Details" value="#{req.tests2}" readonly="true" required="true"/>

<h:selectBooleanCheckbox label="Hide field" value="#{req.bool1}"/>
<ui:fragment rendered="#{not req.bool1}">
    <h:inputText label="Hidden" value="#{req.test3}" required="true"/>
</ui:fragment>

我的表单中有required个字段,但如果用户选择先设置复选框,我希望即使验证失败隐藏字段也会出现。而且我希望字段被标记为无效,所以我不能使用立即数。


问题是在处理验证时,renderResponse 在 jsf 生命周期 中被调用。所以更新模型值阶段被跳过,我无法对用户输入做出反应。

除此之外:如果我填写所有 required 字段并选中复选框(表单将有效)并取消选中复选框(出现 required 字段 "Hidden") , 我 cannot 只是通过选中复选框使 "Hidden" 再次消失,因为 "Hidden" 不能像 required 字段一样为空。 即使我说required="#{not req.bool1}"它也不起作用,因为复选框值永远不会到达我的模型,因为更新模型值阶段被跳过。

我们现在所做的是包装 faces 上下文,以防止在验证阶段调用 renderResponse() 设置标志。 (是的,危险的,是的,我确实需要更好的方法来做到这一点。)现在模型终于是最新的了,但是: 必填字段仍然为空,因为出于某种原因 jsf 决定 required 字段不需要从我的模型中获取它们的值,只要它们是 empty/invalid.

  1. 如何让我的模型 values 出现在 required 字段中?
  2. 有没有简单和正确的方法来解决我的忽略无效状态和继续阶段问题,除了基本上防止 renderResponse() 发生?

所以第一个问题的答案是:重置值然后更新,然后我将我的值显示在必填字段中。谢谢瓦西尔!

关于第二个问题:我想知道以前怎么可能没有人运行解决过这个问题。只有我吗?好吧,我想我没有明白要点,并且使用了错误的生命周期之类的东西。但我真的认为视图应该响应用户输入,即使有些字段仍然是空的。毕竟用户仍在插入数据,我们还没有继续。在该状态下,字段允许为空。 我想这就是重点,我的 "required" 的意思不同于 jsf "required"。在这方面我仍然没有得到标准的验证过程...

但我的问题有一个肮脏的解决方法,所以我会将问题标记为已回答。