2010-09-23 29 views
0

我遇到问题required = true将应用于禁用字段的验证。jsf验证问题 - 对禁用的输入字段应用所需的字段验证

我有一个a4j:commandButton和两个下拉菜单,其中包含状态列表和表单内的国家/地区列表。这两个下拉列表都需要应用=“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="">...</select>

没有人有任何想法,为什么JSF:<select disabled="disabled">...</select>

的下拉使用jQuery禁用正在验证由jquery禁用的字段?

回答

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>将重新呈现的状态下拉菜单的每一个变化的国家下拉。国家下拉菜单依次具有连接到boolean bean属性的disabled属性。您必须确保它基于当前选定的状态返回所需的结果。你可以在getter方法或状态下拉列表的valueChangeListener中做到这一点。

+0

嗨,我们想到了这种方法,但最让我们困扰的是:如果在ajax请求重新呈现下拉列表之前按下提交按钮,该怎么办?在这种情况下,我会得到两个验证错误。 我不确定这是真实的生产服务器上的现实吗?基本上这取决于服务器的响应时间。 这是一个很好的做法,即按照即发射ajax的要求来改变UI组件的状态 – 2010-09-23 12:39:38

+0

在Ajax请求运行时覆盖页面或禁用提交按钮。 – BalusC 2010-09-23 12:52:37