【问题标题】:<f:validator disabled flag not working<f:validator disabled 标志不起作用
【发布时间】:2023-03-26 03:04:01
【问题描述】:

我为我的项目创建了一个自定义验证器,它只是检查选择的值并“验证”该值不是“0”。我们有一个标准(我敢肯定并不少见)手动将我们的 selectOneMenu 组件的第一个值设置为:

<f:selectItem itemValue="0"
              itemLabel="-- Select One --"/>

这工作正常,但随后使组件始终通过所需的检查。所以这个验证器只是把这个值当作没有选择。

SelectOneMenu 示例:

<h:selectOneMenu id="eligibility"
             value="#{reg.eligibility}"
             required="#{reg.fieldsRequired}">
<f:selectItem itemValue="0"
              itemLabel="-- Select One --"/>
<f:selectItems value="#{reg.eligibilityList}" />
<f:validator validatorId="selectOneValidator"
             disabled="#{!reg.fieldsRequired}"/>

自定义验证器:

@FacesValidator("selectOneValidator")

公共类 SelectOneValidator 实现 Validator {

@Override
public void validate(FacesContext context, UIComponent uiComponent, Object o) throws ValidatorException {
    String val = null;
    if (uiComponent instanceof HtmlSelectOneMenu) {
        HtmlSelectOneMenu oneMenu = (HtmlSelectOneMenu) uiComponent;


        if (oneMenu.isRequired() && !oneMenu.isDisabled()) {
            if (o instanceof String) {
                val = (String) o;
            } else if (o instanceof Number) {
                val = String.valueOf(o);
            }

            if ("0".equals(val)) {
                FacesMessage msg = new FacesMessage();
                msg.setSummary("Please select a value from the list.");
                msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                throw new ValidatorException(msg);
            }
        }
    }
}

}

到目前为止,这工作得很好,但是,当前的用例我遇到了麻烦。 我的页面有多个 SelectOneMenus,其中一个通过页面的 ajax 调用来切换必需和禁用的属性。但是,我对required="#{reg.fieldsRequired}" 没有任何问题;我的自定义验证器上的 disabled="#{!reg.fieldsRequired}" 属性似乎没有什么不同。我只是在大声思考,但是当页面第一次加载时,#{reg.fieldsRequired} 表达式是错误的。如果我然后更改 SelectOneMenu 以将此布尔值设置为 true,然后按提交按钮,则似乎没有设置 disabled 属性。我想知道这是否只是一个 ajax 问题,并且所有组件都只需要重新渲染,所以我在我的 ajax 调用中添加了@form:&lt;a4j:ajax render="@form" listener="#{reg.saveActionChanged}"/&gt;,希望能解决问题,但行为没有区别。

环境:
JSF 2.0.3
Tomcat 6.0.14
使用 RichFaces 4.0 进行 ajax 调用

非常感谢任何帮助!

【问题讨论】:

    标签: ajax jsf validation


    【解决方案1】:

    抱歉,我无法在 JSF 2.1.3 中重现您的问题。 &lt;f:validator disabled&gt; 按预期工作。

    但是,作为一个完全不同的选择,在这种特殊情况下,您可以只使用标准的required 验证器。您只需要将项目值设置为#{null} 而不是0

    <f:selectItem itemValue="#{null}" itemLabel="-- Select One --"/>
    

    这样您就不需要自定义验证器。消息可以设置为输入组件的requiredMessage属性。

    <h:selectOneMenu requiredMessage="Please select a value from the list.">
    

    【讨论】:

    • 你提到改变我这样做的方式并简单地将值设置为空,这很有趣。但是,我实际上想到了这一点(当然是在我发布之后);由于尝试在 int 字段上设置空值而出现错误。我仍在与这个令人讨厌的事情作斗争,因为由于某种带有 disabled 属性的错误,我真的不想改变我的架构。不过,我对此束手无策,所以这可能是临时的解决方案。
    • 使用Integer 而不是int。可为空的模型值不应是基元。
    • 不确定它是否重要,但只是为了清除您的测试用例的任何歧义(只是希望您可以重现),SelectOneMenu 只需通过 设置 required/disabled 标志听众。一旦设置好,然后我单击命令按钮以提交到服务器,并且无论确定必需/禁用的布尔值如何,只有必需的属性似乎表现正确。 disabled 属性似乎不太关心该值的设置。我尝试在 组件的渲染属性上设置@form@all,但仍然没有运气。
    • 所以我最终采用了您提出的解决方案,方法是将#{null} 作为 SelectOneMenu 中的第一个可用值传递...这让我想到了一个关于将这些值插入数据库的问题.我正在使用基本的 OJDBC,因此在我准备好的语句中,我不能使用 prepStmt.setInt(object.possibleNull)'. I've tried using the setObject()` 并且工作正常,但是在我走得太远之前,有什么我应该避免的陷阱吗? IE。我应该使用准备好的语句的不同set*() 吗?再次感谢 BalusC。你帮了我很多忙!
    猜你喜欢
    • 2014-07-13
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2018-07-10
    • 2022-08-11
    • 2015-08-16
    • 2019-02-02
    • 1970-01-01
    相关资源
    最近更新 更多