【问题标题】:Disable validation, if the current UIInput component has a null or empty value如果当前 UIInput 组件具有 null 或空值,则禁用验证
【发布时间】:2014-06-18 11:45:53
【问题描述】:

只有当UIInput 组件的值是null 或为空时,我才需要验证UIInput 组件所持有的值的长度。

长度验证器 - <f:validateLength> 应被跳过/绕过,以防值为 null 或为空。

我尝试了以下方法,但没有成功。

<p:inputTextarea id="address" autoResize="false" value="#{testManagedBean.address}" maxlength="1000" minQueryLength="10" cols="35" rows="7">
    <f:validateLength minimum="5" maximum="1000" disabled="#{empty testManagedBean.address}"/>
</p:inputTextarea>

<p:message for="address" display="both" showSummary="false"/>
<p:commandButton value="Submit" actionListener="#{testManagedBean.action}"/>

豆子:

@ManagedBean
@ViewScoped
public final class TestManagedBean implements Serializable
{
    private String address;
    private static final long serialVersionUID = 1L;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public void action() {
        System.out.println("action() called.");
    }
}

此字段 - “地址”实际上是可选的,但如果某些用户提供输入,则它应包含至少五个字符的长度。


编辑:

UIInput 组件具有空值或空值时,我正在使用disabled="#{empty param['form:address']}" 禁用验证器(无论如何都不会进一步挖掘更好的方法)。

【问题讨论】:

  • 通过将 validateLength 设置为必填字段。您拥有的另一个选择是在您的操作方法中在服务器端验证这一点。
  • 我希望 OmniFaces 应该有一些魔力 :)
  • OmniFaces?这和这有什么关系?
  • OmniFaces 中可能存在一些内置的验证器技巧 :)

标签: jsf primefaces jsf-2.2


【解决方案1】:

不需要 OmniFaces:您可以创建自己的验证器。您必须创建一个实现javax.faces.validator.Validator 接口的类,覆盖validate() 方法,并在您的xhtml 页面中调用它。另一种选择是:

<p:inputTextarea id="address" autoResize="false" value="#{testManagedBean.address}" maxlength="1000" minQueryLength="10" cols="35" rows="7">
  <f:validator validatorId="myValidator"/>
</p:inputTextarea>

验证器类:

@FacesValidator("myValidator")
public class MyValidator Validator{

  @Override
  public void validate(FacesContext context, UIComponent component, Object value) 
        throws ValidatorException {
    String myValue = value.toString();
    if(myValue != null && !myValue.isEmpty() && (myValue.length() <= 5 || myValue.length() >= 1000)){
      throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
          "MyValidator Error: ", 
          "This error appears if your input has less than 5 chars or more than 1000."));
    }
  }
}

【讨论】:

  • 自定义验证器是最后一个阶段。如果我找不到内置方法,我将使用自定义验证器:)
【解决方案2】:

您在正确的轨道上,但您没有正确地从组件中提取价值。

将组件绑定到页面范围并检索值,如下所示:

<p:inputTextarea id="address" binding="#{theAddress}" autoResize="false" value="#{testManagedBean.address}" maxlength="1000" minQueryLength="10" cols="35" rows="7">
    <f:validateLength minimum="5" maximum="1000" disabled="#{empty theAddress.getSubmittedValue()}"/>
</p:inputTextarea>

您当前的方法需要将 textArea 的值写入支持 bean。这在验证发生之前不会发生(请记住:testManagedBean.address 仅在验证成功后可用);您期望在 验证期间具有相同的值:catch 22.

【讨论】:

  • 抱歉,使用 disabled="#{empty theAddress.getSubmittedValue()}" 并没有发生任何新情况。 theAddress.getSubmittedValue() 始终为空。
  • @Tiny - 这很奇怪。尝试不同的条件:#{theAddress.isLocalValueSet()}。这将返回一个布尔值。
  • #{theAddress.isLocalValueSet()} 返回 true,即使 &lt;p:inputTextarea&gt; 留空(&lt;p:inputTextarea&gt; 没有输入)。
  • 当我使用disabled="#{empty param['form:address']}" 时,验证器被正确禁用。直接依赖请求参数还是不合适的。
  • @Tiny - 我相信空文本无法正确验证的原因与:stackoverflow.com/q/14607439/1530938
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多