2

コマンドリンクを介したajaxリクエストの後にフォームにフィールドを表示しようとしていますが、リンクをクリックすると不正な形式のXMLエラーが発生します。xhtmlファイルは次のようになります:

            <h:form>    
                .
                .
                <tr>
                    <td>Product Image*:</td>
                    <td>
                        <h:graphicImage url="#{addItem.prodFileName}" width="100" height="100"/>
                        <br /><h:commandLink  value="change image" >
                            <f:ajax event="click" render="uploadimage" execute="@this" listener="#{addItem.ChangeImage}"/>
                        </h:commandLink>
                    </td>
                </tr>

                <tr >
                    <td>
                        <t:inputFileUpload rendered ="#{addItem.editImgChange}" label="editImage" id="uploadimage" value="#{addItem.uploadedFile}" />
                        <h:messages for="prodimage"/>
                    </td>
                </tr>
                .
                .
            </h:form>

AddItem BeanはRequestScopedであり、次のコード行があります。

    @ManagedBean
    public class AddItem extends AbstractBean {
        //..
    boolean editImgChange=false;
        //...           
    public void ChangeImage(){
    this.editImgChange=true;
        }
    }

つまり、ユーザーが画像の変更リンクをクリックした後にのみ、t:inputFileUploadフィールドを表示したいと思います。初期値がfalseのsegmentBeanにフラグeditImgChangeを保持しており、ユーザーが画像の変更リンクをクリックすると、フラグがtrueに変更されます。プログラムはChangeImage()メソッドに移動しますが、その後エラーが発生します

"malformedXML:During update:j_idt30:uploadimage not found"

私のデザインが悪い場合に備えて、同じ結果を達成するために、まったく異なるソリューションにも満足しています。

4

1 に答える 1

11

属性は、render常にHTMLにレンダリングされるコンポーネントのIDを指している必要があります。つまり、ajax応答に基づいてコンテンツを更新/置換することになっているのはJavaScriptです。ただし、コンポーネントがHTMLにレンダリングされない場合、JavaScriptはそのコンテンツを更新/置換できません。常にHTMLにレンダリングされる別のコンポーネントでラップしてから、代わりに更新する必要があります。

例えば

<h:panelGroup id="uploadimage">
    <t:inputFileUpload rendered ="#{addItem.editImgChange}" label="editImage" value="#{addItem.uploadedFile}" />
</h:panelGroup>
于 2011-09-26T15:05:34.543 に答える