Modify.xhtml
<table border="0" align="left" cellpadding="10" cellspacing="0">
<tr>
<td>通訊地址 : </td>
<td><p:selectOneMenu value="#{modify.comAddressContry}" style="width: 120px">
<f:selectItem itemLabel="--選擇城市--" itemValue="--選擇城市--"/>
<f:selectItems value="#{modify.tw.country_map}"/>
<p:ajax update="district_change_com" event="change" listener="#{modify.com_country_change()}"/>
</p:selectOneMenu>
</td>
<td><p:selectOneMenu id="district_change_com" value="#{modify.comAddressDistrict}" style="width: 120px">
<f:selectItem itemLabel="--選擇地區--" itemValue="--選擇地區--" />
<f:selectItems value="#{modify.tw.district_map}"/>
<p:ajax update="com_all" listener="#{modify.com_zipcode_change()}"/>
</p:selectOneMenu>
</td>
<td><p:inputText id="com_all" value="#{modify.comAddressAll}" style="width: 300px"/></td>
<td>通訊地電話 : </td>
<td><p:inputText value="#{modify.houseAddressTel}" maxlength="11" /></td>
</tr>
<tr>
<td>戶籍地址 :</td>
<td><p:selectOneMenu value="#{modify.houseAddressContry}" style="width: 120px">
<f:selectItem itemLabel="--選擇城市--" itemValue="--選擇城市--"/>
<f:selectItems value="#{modify.tw.country_map}"/>
<p:ajax update="district_change" event="change" listener="#{modify.country_change()}"/>
</p:selectOneMenu>
</td>
<td><p:selectOneMenu id="district_change" value="#{modify.houseAddressDistrict}" style="width: 120px">
<f:selectItem itemLabel="--選擇地區--" itemValue="--選擇地區--" />
<f:selectItems value="#{modify.tw.district_map}"/>
<p:ajax update="house_all" listener="#{modify.zipcode_change()}"/>
</p:selectOneMenu>
</td>
<td><p:inputText id="house_all" value="#{modify.houseAddressAll}" style="width: 300px"/></td>
<td>戶籍地電話 : </td>
<td><p:inputText value="#{modify.houseAddressTel}" maxlength="11" /></td>
</tr>
</table>
我正在尝试PrimeFaces中的双组合选择功能。当我使用它一次时效果很好但是当我在同一页面中使用它两次时(在相同的表单中),当我提交所选数据时,页面显示验证错误。对这个问题有任何想法吗?
答案 0 :(得分:1)
如果bean是请求作用域并因此在每个HTTP请求上重新创建,那么就会发生这种情况(请注意,每个ajax请求也算作一个单独的HTTP请求)。在每次提交时,JSF将根据可用项列表验证提交的下拉值。但是,如果bean是请求作用域,则每次都会将此列表重新初始化为默认值。因此,如果级联下拉列表的默认初始化列表不代表用户提交表单时的正确列表,那么您将收到“验证错误:值无效”。
将bean放在视图范围中,只要你通过ajax请求与同一个视图交互,它就可以解决问题。
@ManagedBean
@ViewScoped
public class Modify {
// ...
}