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>

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

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

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

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

有任何想法吗?

最好的问候,弗洛里安

4

1 回答 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 的提交按钮#{not empty param['form:go']}进行时才进行评估。如果您也不喜欢硬编码客户端 ID,请按如下方式引用它:trueform:go

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

    ...

    <p:commandButton binding="#{go}" ... />
</h:form>
于 2012-11-16T16:11:05.607 回答