1

2 つのカスケードp:selectOneMenuコンポーネントがあります。1 つ目はハッシュマップからエリアを表示し、2 つ目は ajax によって選択されたエリアの都市を表示します。しかし、都市を選択してフォームを送信すると、

検証エラー: 値が無効です

これがビューです

<p:selectOneMenu id="area" value="#{bean.area}">
    <f:selectItem itemLabel="Select Area" itemValue="" />
    <f:selectItems value="#{bean.areas}" />
    <p:ajax update="city" listener="#{bean.handleAreaChange()}" />
</p:selectOneMenu>
<p:selectOneMenu id="city" value="#{bean.city}">
    <f:selectItem itemLabel="Select City" itemValue="" />
    <f:selectItems value="#{bean.cities}" />
</p:selectOneMenu>  

これが豆です:

private String area;
private String city;
private Map<String, String> areas = new HashMap<String, String>();
private Map<String, String> cities = new HashMap<String, String>();
private Map<String, Map<String, String>> allCities = new HashMap<String, Map<String,String>>();

public void handleAreaChange() {
    if (area != null && !area.isEmpty()) {
        cities = allCities.get(area);
    } else {
        cities = new HashMap<String, String>();
    }
}

これはどのように発生し、どうすれば解決できますか?

4

3 に答える 3

1

ドロップダウンの送信された値が使用可能な値のリストに含まれていない場合、このエラーが発生します。つまり、これは、フォームを表示するHTTPリクエストと比較して、フォーム送信のHTTPリクエスト中に使用可能な値のリストが互換性なく変更されたことを意味します。これは、多くの場合、バッキングBeanがリクエストスコープであり、使用可能な値のリストがその(ポスト)コンストラクターで事前に初期化されていないことを意味します。

Beanをビュースコープに配置するかリクエストパラメータに基づいて使用可能な値のリストを適切に事前初期化するコードを追加すると、問題が解決するはずです。

于 2012-10-16T10:44:50.120 に答える
1

BalusC が言ったように、の値 (識別子)selectItemが変更されました。これは、Bean がリクエスト スコープである場合、またはオブジェクトがサーバー側で変更された場合に発生する可能性があります。

私が使用する一般的な解決策は、 の値をselectItemそれが表すオブジェクトの ID に設定することです。

一意の識別子 (id) を想定CityArea、次のようにします。

public class City //or Area
{
    private Long id;
    private String name;

    //Rest of class
}

City次に、とのコンバーターを導入できますArea

@FacesConverter("cityConverter")
public class CityConverter implements javax.faces.convert.Converter
{
    @Override
    public Object getAsObject(FacesContext ctx, UIComponent cmp, String str)
    {
        //Convert id to Object (City) and return it
    }

    @Override String getAsString(FacesContext ctx, UIComponent, Object obj)
    {
        //Return the id that represents the Object (City) here
        return ((City)obj).getId().toString();
    }
}

JSF ページでコンバーターを使用します。

<p:selectOneMenu id="area" value="#{bean.area}" converter="areaConverter">
    <f:selectItem itemLabel="Select Area" itemValue="" />
    <f:selectItems value="#{bean.areas}" />
    <p:ajax update="city" listener="#{bean.handleAreaChange()}" />
</p:selectOneMenu>
<p:selectOneMenu id="city" value="#{bean.city}" converter="cityConverter">
    <f:selectItem itemLabel="Select City" itemValue="" />
    <f:selectItems value="#{bean.cities}" />
</p:selectOneMenu>

このサイトで FacesConverter を実装する方法の詳細

于 2012-10-16T14:25:17.577 に答える
0

最初に行う必要があるのは、ajaxをイベントにリンクするように指示することです。したがって、おそらくvalueChangeイベントで発生させたいので、ajaxは次のようになります。

<p:ajax update="tmil2" event="valueChange" listener="#{BeanAreaAndCity.handleCityChange()}"></p:ajax> 
于 2012-10-15T14:57:36.007 に答える