我在附加到下拉列表的 ValueChangeListener 时遇到问题。
这是代码:
<h:selectOneMenu
value = "#{MultiFileSelectMgmtBean.selectedLocationName}"
valueChangeListener = "#{MultiFileSelectMgmtBean.LocationChangeEvent}"
onchange = "submit();"
>
<f:selectItems
value = "#{MultiFileSelectMgmtBean.locationsListItems}">
</f:selectItems>
</h:selectOneMenu>
这是支持 bean:
protected List<SelectItem> locationsListItems;
...
public void LocationChangeEvent( ValueChangeEvent vce ) throws Exception
{
selectedLocationName = (String) vce.getNewValue();
}
问题是“selectedLocationName”获取“11”或“13”值,即使下拉列表中填充了两个字符串“LocationTest1”和“LocationTest2”。
vce.getNewValue 可能存在什么问题?
最佳答案
下拉列表的提交值是选项value,而不是您想象的选项label。请注意,该方法也称为 getNewValue()
,不是getNewLabel()
。选项标签不通过 HTML 表单提交通过 HTTP 从客户端发送到服务器。无法从 HTTP 请求中提取它们。
如果由于某些不清楚的原因您确实需要选项标签而不是选项值,那么您要么需要在创建选择项时使用它而不是选项值,要么需要映射与选项值在某处,以便您可以通过此映射中的值获取标签。很有可能您的 bean 中已经有这种映射,否则您将无法填充 <f:selectItems>
值:)
另请参阅:
<小时/>与具体问题无关: <h:selectOneMenu>
的组合,一个valueChangeListener
和onchange="submit()"
表示您正在使用 JSF 1.x 特定的 hack 来实现根据下拉列表的更改填充另一个下拉列表或字段的功能要求。由于您似乎已经在使用 JSF 2.x,我建议您完全忘记这种方法,只使用 <f:ajax listener>
反而。上述链接的 wiki 页面包含一个示例。
关于java - ValueChangeEvent.getNewValue() 未从 JSF 2 中的下拉列表中返回正确的字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777353/