我有以下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(这也是域内“无选择”的预期值)。
所以我的问题是我必须做些什么才能完成我的案子。 对于我而言,这是一个标准案例,我无法想象没有解决方案。
有什么想法吗?
祝你好运, 弗洛里安
答案 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>