我想从中获取价值。我尝试了这段代码,但它不起作用:
<h:form>
<h:outputLabel value="départements : "/>
<h:selectOneMenu value="#{departementController.selected.id}" onchange="submit()" immediate="true">
<f:valueChangeListener type="Controller.Listener.DepartementValueListener"/>
<f:selectItems value="#{departementController.itemsAvailableSelectOne}"/>
</h:selectOneMenu>
<h:outputLabel value="nouvelle valeur : "/>
<h:inputText value="#{departementController.comboBox}" id="dep"/>
</h:form>
控制器:
//departement change listener
private String comboBox;
public String getComboBox() {
return comboBox;
}
public void setComboBox(String comboBox) {
this.comboBox = comboBox;
}
public void departementChangeListener(ValueChangeEvent e) {
// Skip validation of non-immediate components and invocation of the submit() method.
FacesContext.getCurrentInstance().renderResponse();
this.comboBox = e.getNewValue().toString();}
sourceId = j_idt7:j_idt9 [severity =(ERROR 2),summary =(j_idt7:j_idt9:erreur de validation.La valeur est incorrecte。),detail =(j_idt7:j_idt9:erreur de validation.La valeur est incorrecte。 )]
答案 0 :(得分:4)
你毕竟遇到了两个问题。
首先,错误“erreur de validation.La valeur est incorrecte”这是法语翻译“验证错误:值无效”表示提交值不equals()
<f:selectItems>
中的任何一个可用项。您的代码不够完整,无法指出根本原因,但我猜测您List<Department>
中有<f:selectItems value>
,因此每个项目都是Department
,但您尝试将其设置为String
id
而不是Department
。这个不对。您需要在Department
和String
之间提供转换,然后使用#{departementController.selected}
。
这样的事情:
<h:selectOneMenu value="#{bean.selectedDepartment}">
<f:selectItems value="#{bean.availableDepartments}" />
</h:selectOneMenu>
与
private Department selectedDepartment;
private List<Department> availableDepartments;
@FacesConverter
可在Department
及其唯一String
表示之间进行转换。
您的第二个问题是,您似乎过于关注JSF 1.x目标示例,以便在更改下拉列表时填充另一个字段。你正在使用一个相当笨拙/ hacky的JSF 1.x解决方法。在JSF 2.x中,您只需使用<f:ajax>
即可。
<h:selectOneMenu value="#{bean.selectedDepartment}">
<f:selectItems value="#{bean.availableDepartments}" />
<f:ajax listener="#{bean.changeDepartment}" render="inputId" />
</h:selectOneMenu>
<h:inputText id="inputId" value="#{bean.input}" />
与
public void changeDepartment() {
input = selectedDepartment.getId();
}