我在selectOneMenu上进行了验证,以防止用户在列表中选择“无”项目。
<h:selectOneMenu id="selectMenu" value="#{bean.selectedValue}" required="true" requiredMessage="Please select an item">
<f:ajax render="toRender selectMenuMessage" listener="#{bean.onSelect}"/>
<f:selectItem itemLabel="None" noSelectionOption="true"/>
<f:selectItems value="#{bean.items}" var="item" itemValue="#{item.id}" itemLabel="#{item.label}"/>
</h:selectOneMenu>
我的面板位于下方,只有在我的商品不是“无”时才会显示。 因此,当我选择“无”时,消息应该呈现并且面板消失。
<h:panelGroup id="toRender">
<h:panelGrid rendered="#{bean.selectedValue == 0 ? false : true">
...
</h:panelGrid>
</h:panelGroup>
它在没有验证的情况下工作但是我无法使两者都工作。就像验证阻止渲染一样。
有什么建议吗? 感谢
答案 0 :(得分:1)
我猜bean.selectedValue
是一个整数,所以试试这个:
<f:selectItem itemValue="0" itemLabel="None" noSelectionOption="true"/>
<小时/> 修改: 对不起,我认为你的问题有点误解了 这里的问题是,如果你需要selectOneMenu的值,那么如果值为空,则不会提交该值。如果选择了
noSelectionOption="true"
的项目,则会将其视为空,因此不会提交任何值。当您检查bean.selectedValue == 0
时,selectedValue
将永远不会 - 除了最初 - 为0,因为当您选择值为0的项目时,它将不会被提交,如上所述。bean.selectedValue == 0
的检查无法一起工作。我建议你删除验证。
答案 1 :(得分:0)
我有回应,这不是解决方案,但这是另一种方法......
<h:selectOneMenu id="selectMenu" value="#{bean.selectedValue}">
<f:ajax render="toRender selectMenuMessage" listener="#{bean.onSelect}"/>
<f:selectItem itemLabel="None" noSelectionOption="true"/>
<f:selectItems value="#{bean.items}" var="item" itemValue="#{item.id}" itemLabel="#{item.label}"/>
</h:selectOneMenu>
在豆中
public void onSelect() {
if(this.selectedValue != 0) {
// Do smthg here
} else {
// Display error message
UIComponent component = Outils.getFacesContext().getViewRoot().findComponent(":form:selectMenu");
if(component != null) {
Outils.getFacesContext().addMessage(component.getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "Test msg"));
}
}
}
这样就不会启动验证过程,并且会在bean中完成验证。
如果有人找到更好的东西,请告诉我!