我有2个命令按钮,一个选择一个菜单。我需要调用bean方法,具体取决于所选的按钮和菜单中当前选择的项目。
<h:form id="form1">
<h:outputLabel value="menu:" />
<h:commandButton value ="en" action="#{bean.exec}" >
<f:setPropertyActionListener target="#{bean.menu}" value='en' />
</h:commandButton>
<h:commandButton value ="fr" action="#{bean.exec}" >
<f:setPropertyActionListener target="#{bean.menu}" value='fr' />
</h:commandButton>
<h:outputLabel value="id:" />
<h:selectOneMenu value="#{bean.id}">
<f:selectItems value="#{bean.idlist}" />
<f:ajax listener="#{bean.exec}" render ="form1" />
</h:selectOneMenu>
</h:form>
但是,虽然第一个按钮更新了我的属性并调用了action方法,但第二个按钮给了我以下消息
警告:FacesMessage已入队,但可能尚未显示
并且第一次点击时视图不会更新。但是,第二次单击时,属性会立即更新,视图也会更新。
这是如何引起的?如何解决?
答案 0 :(得分:0)
我确实看到了日志,但是我不明白错误:这就是它显示的内容:form1:j_idt124:验证错误:值无效是什么值以及在哪里?
如果您为所有输入组件提供ID并将<h:message>
附加到它们,则更容易识别该值,如下所示:
<h:outputLabel for="id" value="id:" />
<h:selectOneMenu id="id" value="#{bean.id}">
<f:selectItems value="#{bean.idlist}" />
<f:ajax listener="#{bean.exec}" render ="form1" />
</h:selectOneMenu>
<h:message for="id" />
这样,您将form1:id
作为标签而不是form1:j_idt124
。或者,您也可以指定输入组件的label
:
<h:selectOneMenu label="id" ... />
对于“值无效”错误,当处理表单提交期间所选值与任何一个可用值都不匹配时,您将收到此错误。当处理表单提交期间#{bean.idlist}
后面的属性发生不兼容更改时,可能会发生这种情况。当bean是请求作用域时,这反过来会发生。将bean放在视图范围内应该修复它。