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

时间:2015-10-30 17:14:27

标签: jsf jsf-2.2 lifecycle required

如果表单中有空required个字段,则会阻止我通过代码设置值,并根据当前用户输入隐藏/显示其他字段。 我将我的问题分解为一个小例子:

<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个字段,但如果用户选择先设置复选框,我希望即使验证失败也会显示隐藏字段。我希望字段被标记为无效,因此我无法立即使用。

问题在于,在处理验证时,在jsf生命周期中调用 renderResponse 。因此,跳过了更新模型值阶段,我无法对用户输入作出反应。

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

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

  1. 如何让我的模型显示在 required字段
  2. 是否有简单且正确的方法来解决我的忽略无效状态和继续阶段正确的问题,除了基本上阻止renderResponse() < / strong>发生了什么?

1 个答案:

答案 0 :(得分:0)

所以第一个问题的答案是:重置值和那么更新,然后我得到我的值显示在必填字段中。谢谢Vasil!

至于第二个问题:我想知道以前没有人遇到过这个问题。只有我吗?好吧,我想我没有明白这一点,并且使用生命周期错误或其他什么。但我真的认为视图应该响应用户输入,即使某些字段仍然是空的。用户仍然在插入数据,但我们还没有继续前进。在该状态下允许字段为空。 我想这就是重点,而我的“必需”意味着除了jsf“必需”之外的东西。在这方面我仍然没有得到标准的验证过程......

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