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

时间:2010-09-23 08:33:06

标签: java validation jsf ajax4jsf

我遇到了 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>

场景#1:点击a4j:commandButton,而不在状态下拉菜单中选择任何内容。 结果:预期的状态下拉列表所需的字段验证错误

现在点击一个单选按钮(表单外),状态下拉列表被禁用,国家下拉列表使用jquery / javascript启用,如下所示:

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

场景#2:点击a4j:commandButton,而不在国家/地区下拉列表中选择任何内容。 结果:州和国家/地区下拉列表都需要字段验证错误。但是,预计只有国家/地区下拉列表的验证错误。

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

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

使用jquery:<select disabled="">...</select>

禁用下拉列表

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

1 个答案:

答案 0 :(得分: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中执行此操作。