1

我对我的 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>

它在没有验证的情况下工作,但我不能同时工作。就像验证阻止渲染一样。

有什么建议吗?谢谢

4

2 回答 2

1

我猜这bean.selectedValue是一个整数,所以试试这个:

<f:selectItem itemValue="0" itemLabel="None" noSelectionOption="true"/>


编辑: 啊抱歉,我想有点误解了你的问题。
这里的问题是,如果您需要 selectOneMenu 的值,则如果该值为空,则不会提交该值。并且如果noSelectionOption="true"选择了带有的项,则将其作为空处理,因此不会提交任何值。当您检查 时bean.selectedValue == 0selectedValue永远不会(可能最初除外)为 0,因为当您选择值为 0 的项目时,它将不会被提交,如上所述。
所以你是对的,你的验证和检查bean.selectedValue == 0不能一起工作。我建议您只删除验证。
如果这不是您的选择,请详细解释为什么您需要它以这种方式工作。

于 2013-07-18T14:28:06.220 回答
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 中完成的。

如果有人找到更好的东西,请告诉我!

于 2013-07-19T06:42:49.433 回答