首页 文章

jsf验证问题 - 对禁用的输入字段应用必需的字段验证

提问于
浏览
0

我遇到了 required=true 验证的问题,该验证适用于禁用的字段 .

我有一个a4j:commandButton和两个下拉列表,其中包含状态列表和表单中的国家/地区列表 . 这两个下拉列表都要求=“true”验证 . 默认情况下,使用标记属性disabled =“true”启用状态下拉列表并禁用国家/地区下拉列表,如下所示:

<h:selectOneMenu value="#{states}" required="true">
  <f:selectItems>
</h:selectOneMenu>

<h:selectOneMenu value="#{countries}" disabled="true" required="true">
  <f:selectItems>
</h:selectOneMenu>

Scenario# 1: 单击a4j:commandButton,而不在状态下拉列表中选择任何内容 . result: 所需的状态下拉列表的字段验证错误

现在单击单选按钮(表单外部),禁用状态下拉列表并使用jquery / javascript启用国家/地区下拉列表,如下所示:

$j('#stateDropdown').attr('disabled', 'disabled');
$j('#countryDropdown').removeAttr('disabled');

Scenario# 2: 点击a4j:commandButton,而不在国家/地区下拉列表中选择任何内容 . result: 州和国家/地区下拉列表的必填字段验证错误 . 但是,预计只有国家/地区下拉列表的验证错误 .

运行时为 <h:selectOneMenu> 标记生成的html代码:

使用jsf tag attibute禁用下拉列表: <select disabled="disabled">...</select>

使用jquery禁用下拉列表: <select disabled="">...</select>

有谁知道为什么jsf验证jquery禁用的字段?

1 回答

  • 0

    JSF基于服务器端的JSF UIComponent 树进行验证,而不是像您期望的那样在客户端的HTML DOM树上进行验证 . 使用jQuery,您只需在客户端更改HTML DOM树,而无需向JSF通知状态更改,以便它可以在组件树中反映它 .

    您必须使用JSF而不是jQuery禁用/启用它 . 当您使用Ajax4jsf时,可以使用 a4j:support .

    <h:selectOneMenu value="#{bean.state}" required="true">
        <f:selectItems value="#{bean.states}" />
        <a4j:support event="change" reRender="country" />
    </h:selectOneMenu>
    <h:selectOneMenu id="country" value="#{bean.country}" required="true" disabled="#{bean.countryDisabled}">
        <f:selectItems value="#{bean.countries}" />
    </h:selectOneMenu>
    

    在此示例中, <a4j:support> 将在状态下拉列表的每次更改时重新呈现国家/地区下拉列表 . 反过来,国家/地区下拉列表的 disabled 属性附加到布尔bean属性 . 您必须确保它根据当前选择的状态返回所需的结果 . 您可以在getter方法或状态下拉列表的 valueChangeListener 中执行此操作 .

相关问题