2

私は次のJSF2コードを持っています:

    <p:selectOneMenu id="dropdown" value="#{data.selection}" required="true" converter="selectOneMenuConverter">
            <f:selectItem itemLabel="Select one..." itemValue="" noSelectionOption="true" />
            <f:selectItems value="#{data.entries}" var="entry" itemLabel="#{entry.name}" itemValue="#{entry}" />
            <p:ajax update="display" event="change" />
    </p:selectOneMenu>

    <h:panelGroup id="display">
            <h:outputText value="#{data.selection}" />
    </h:panelGroup>

ドロップダウンから値を選択すると、すべてが期待どおりに機能します。ユーザーが「SelectOne」を選択してエントリを「選択解除」すると、selectonemenuが必要なため、これは不可能であるとJSFは文句を言います。

問題は、p:ajaxが検証をトリガーする部分的な送信を行うことです。(selectonemenuのように)入力フィールドで即時が発生した場合に検証が実行されるため、Immediate=trueも機能しません。検証は、ユーザーがページの下部にある[続行]ボタンを押したときにのみ発生します(コードには表示されていません)。

さらに、指定されたコンバーターは文字列をオブジェクトに変換し、デフォルト値の場合はnullを返します(これは「選択なし」のドメイン内で期待される値でもあります)。

だから私の質問は、私のケースを遂行するために私がしなければならないことです。私にとってこれは標準的なケースであり、これに対する解決策がないとは想像できません。

何か案は?

よろしく、フロリアン

4

1 に答える 1

3

検証は、ユーザーがページの下部にある[続行]ボタンを押したときにのみ発生します(コードには表示されていません)。

次に、ドロップダウンのrequired属性に、をハードコーディングする代わりに、それを正確に実行するように指示しtrueます。

<h:form id="form">
    <p:selectOneMenu ... required="#{not empty param['form:go']}">
        ...
    </p:selectOneMenu>

    ...

    <p:commandButton id="go" ... />
</h:form>

は、特定の例でクライアントIDを持つ送信ボタンによってフォームの送信が実際に行われた場合に#{not empty param['form:go']}のみ評価されます。クライアントIDのハードコーディングも気に入らない場合は、次のように参照してください。trueform:go

<h:form>
    <p:selectOneMenu ... required="#{not empty param[go.clientId]}">
        ...
    </p:selectOneMenu>

    ...

    <p:commandButton binding="#{go}" ... />
</h:form>
于 2012-11-16T16:11:05.607 に答える