【问题标题】:Submit empty value to bean anyway on input with required="true"在 required="true" 的输入上向 bean 提交空值
【发布时间】:2015-06-01 07:42:42
【问题描述】:

我在下面输入了required="true"

<p:inputText value="#{bean.value}" required="true">
    <p:ajax event="change" listener="#{bean.change()}" />
</p:inputText>

当用户更改值时,监听器被触发,我可以访问更改后的值。当用户清空该字段时,不会触发侦听器并且空值不会在我的 bean 中更新。我认为这是由requried="true" 引起的。我想用空值更新我的 bean 并在用户清空字段时触发侦听器。我怎样才能做到这一点?

【问题讨论】:

  • 毫无目的。当发生任何转换/验证违规时,不会调用任何操作(侦听器)。

标签: ajax jsf jsf-2 primefaces required


【解决方案1】:

您也可以在 required 属性中使用表达式语言 (EL)。然后,您可以检查是否已按下表单的主要提交按钮。假设您的表单有一个如下所示的“保存”按钮,

<p:inputText ... required="true">
    <p:ajax ... />
</p:inputText>
...
<p:commandButton ... action="#{bean.save}" />

然后您可以让required 属性仅在调用按钮时评估true。您可以通过 binding 引用组件并检查其客户端 ID 是否存在于 HTTP 请求参数映射中来实现:

<p:inputText ... required="#{not empty param[save.clientId]}">
    <p:ajax ... />
</p:inputText>
...
<p:commandButton binding="#{save}" ... action="#{bean.save}" />

请注意,#{save} 是原样的,可能绝对不会绑定到支持 bean,并且变量名称在当前视图和 EL 范围内必须是唯一的。

另见:

【讨论】:

  • 感谢您的回答和编辑问题,我已经按照您所说的做了同样的事情。即使当我试图使该字段为空时,ajax 列表器没有调用,请帮助我。
  • 对我来说很好。您使用的是哪个 JSF impl/version?
  • JSF 版本是 2.1,prime faces 5.0
  • @Kukeltje:我考虑过这一点,但由于从不同的角度提出问题,我想没有人能理解答案的适用性。
【解决方案2】:

问题是,如果用户清除了必填的输入字段,那么“必填”验证器会引发异常,并且不会调用 bean setter。当表单被重新加载时,清除的值将再次从 bean 中显示出来。这是我的解决方法:

public String getSomething() {
    return isFormValueEmpty("form:something") ? null : this.something;
}

private Boolean isFormValueEmpty(String formFieldName) {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    String formValue = ec.getRequestParameterMap().get(formFieldName);
    logger.debug("Check if form value is empty: [{}] [{}]", formFieldName, formValue);
    return StringUtils.isEmpty(formValue);
}

【讨论】:

    猜你喜欢
    • 2017-02-27
    • 2015-07-05
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多