首页 文章

JSF 2:当需要下拉列表且默认条目为空时,无法在下拉列表元素中选择默认条目

提问于
浏览
2

我有以下JSF 2代码:

<p:selectOneMenu id="dropdown" value="#{data.selection}" required="true" converter="selectOneMenuConverter">
            <f:selectItem itemLabel="Select one..." itemValue="" noSelectionOption="true" />
            <f:selectItems value="#{data.entries}" var="entry" itemLabel="#{entry.name}" itemValue="#{entry}" />
            <p:ajax update="display" event="change" />
    </p:selectOneMenu>

    <h:panelGroup id="display">
            <h:outputText value="#{data.selection}" />
    </h:panelGroup>

当我从下拉列表中选择一个值时,一切都按预期工作 . 当用户通过选择“选择一个”来“取消选择”一个条目时,JSF会抱怨这是不可能的,因为需要selectonemenu .

问题来自那里p:ajax进行部分提交以触发验证 . Immediate = true也不起作用,因为如果在输入字段上立即发生(如selectonemenu),则执行验证 . 只有当用户按下页面底部的“继续”按钮(代码中未显示)时才会进行验证

此外,给定的转换器将字符串转换为对象,对于默认值,它返回null(这也是域内“无选择”的预期值) .

所以我的问题是我必须做些什么才能完成我的案子 . 对我而言,这是一个标准案例,我无法想象没有解决方案 .

有任何想法吗?

最好的问候,弗洛里安

1 回答

  • 3

    只有当用户按下页面底部的“继续”按钮(代码中未显示)时才会进行验证

    然后告诉下拉列表的 required 属性,而不是硬编码 true .

    <h:form id="form">
        <p:selectOneMenu ... required="#{not empty param['form:go']}">
            ...
        </p:selectOneMenu>
    
        ...
    
        <p:commandButton id="go" ... />
    </h:form>
    

    当表单提交实际上由具有客户端ID form:go 的提交按钮进行时, #{not empty param['form:go']} 将仅评估 true . 如果您不喜欢硬编码客户端ID,请按如下方式引用它:

    <h:form>
        <p:selectOneMenu ... required="#{not empty param[go.clientId]}">
            ...
        </p:selectOneMenu>
    
        ...
    
        <p:commandButton binding="#{go}" ... />
    </h:form>
    

相关问题