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

时间:2012-11-16 14:53:52

标签: jsf-2 primefaces

我有以下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 个答案:

答案 0 :(得分:3)

  

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

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

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

    ...

    <p:commandButton id="go" ... />
</h:form>

#{not empty param['form:go']}只会在表单提交实际上由特定示例中具有客户端ID true的提交按钮进行评估form:go。如果您不喜欢硬编码客户端ID,请按以下方式引用它:

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

    ...

    <p:commandButton binding="#{go}" ... />
</h:form>