这是我的配置:
> PrimeFaces:4.0.4(精英)
> OmniFaces:1.6.3
> JSF:MyFaces 2.0.2
>服务器:WebSphere 8.5.0.2
一些代码(我只发布了相关部分以便更清晰):
<p:selectOneMenu value="#{viewmodel.selectedContact}" required="true" converter="omnifaces.SelectItemsConverter"> <p:ajax event="change" listener="#{viewmodel.updateContact}" update="area"/> <f:selectItem itemValue="#{null}" itemLabel="#{msg.no_contact}" noSelectionoption="true" /> <f:selectItems value="#{viewmodel.contacts}"/> </p:selectOneMenu>
所以在这里,我们有一个简单的p:selectOneMenu,它包含一个Contact对象列表以及一个“No Contact”选项.如果我想提交表单,则需要此字段.
在列表中选择联系人时,将调用updateContact方法.此方法将生成将显示在由AJAX调用更新的页面的区域部分中的数据.
如果我选择“无联系”选项,则会触发验证错误,因为此字段是必需的,因此不会调用updateContact方法.我希望调用该方法,因为我需要重置一些数据然后隐藏页面的区域部分.
我尝试过使用process =“@ this”,immediate =“true”,但它不起作用.如果immediate =“true”,则选定的Contact不会传递给updateContact方法.
那么,在选择空值时绕过该字段验证的最佳方法是什么?
解决方法
让required属性检查是否调用了命令按钮.您可以通过请求参数映射中存在按钮的客户端ID来检查.
<p:selectOneMenu ... required="#{not empty param[save.clientId]}" /> ... <p:commandButton binding="#{save}" ... />
如果未调用命令按钮(而是调用ajax更改侦听器),则所需属性将评估为false,并且所有内容都将按照您的意图进行.
更新:根据评论,您打算在渲染响应期间始终显示它们.所以,只需添加该检查:
<p:selectOneMenu ... required="#{not empty param[save.clientId] or facesContext.currentPhaseId.ordinal eq 6}" /> ... <p:commandButton binding="#{save}" ... />
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。