malformedXML:更新期间:找不到adminUsersForm

时间:2011-11-15 03:57:56

标签: ajax forms jsf rendering

我对JSF上的ajax有些怀疑。

我的xhtml看起来像这样:

<h:body>
<h:form id="menuForm">
    <h:outputLabel for="menu">Available actions: </h:outputLabel>
    <h:selectOneMenu id="menu" value="#{menu.mainMenuItem}">
        <f:selectItem itemLabel="Select an option..." itemValue="null" />
        <f:selectItems value="#{menu.mainMenuItems}" />
        <f:ajax render=":menuForm :adminUsersForm :loadInfoForm :viewFilesForm" />
        <!-- <f:ajax render="@all" /> -->
    </h:selectOneMenu>
</h:form>

<h:form id="adminUsersForm"
    rendered="#{menu.mainMenuItem == 'Admin users.'}">
    <h:commandButton value="Button 1" />
</h:form>

<h:form id="loadInfoForm"
    rendered="#{menu.mainMenuItem == 'Load info.'}">
    <h:commandButton value="Button 2" />
</h:form>

<h:form id="viewFilesForm"
    rendered="#{menu.mainMenuItem == 'View files.'}">
    <h:commandButton value="Button 3" />
</h:form>
</h:body>

当我使用<f:ajax render=":menuForm :adminUsersForm :loadInfoForm :viewFilesForm" />时,我收到了malformedXML错误,另一方面,当我使用<f:ajax render="@all" />时,正确的<h:form>正在渲染。

这里发生了什么?我读到使用ajax我们可以在同一个表单中呈现组件只是,但是如果我们使用:componentID,则可以渲染-using ajax- components表格。

提前致谢,也许这是一个基本问题,但我对JSF很新,并试图学习。

1 个答案:

答案 0 :(得分:14)

<f:ajax render>应指向JSF生成的HTML DOM树中始终的客户端ID。这是强制性的,因为它是客户端的JavaScript,需要更新HTML DOM树。但是,您将其指向HTML DOM树中 not 的客户端ID,因为它们尚未由JSF呈现。

您需要将具有rendered属性的元素放在JSF生成的HTML DOM树中始终的父组件中。

这是一种方式:

<h:form id="menuForm">
    <h:outputLabel for="menu">Available actions: </h:outputLabel>
    <h:selectOneMenu id="menu" value="#{menu.mainMenuItem}">
        <f:selectItem itemLabel="Select an option..." itemValue="null" />
        <f:selectItems value="#{menu.mainMenuItems}" />
        <f:ajax render=":menuForm :adminUsers :loadInfo :viewFiles :adminUsersForm :loadInfoForm :viewFilesForm" />
    </h:selectOneMenu>
</h:form>

<h:panelGroup id="adminUsers">
    <h:form id="adminUsersForm" rendered="#{menu.mainMenuItem == 'Admin users.'}">
        <h:commandButton value="Button 1" />
    </h:form>
</h:panelGroup>

<h:panelGroup id="loadInfo">
    <h:form id="loadInfoForm" rendered="#{menu.mainMenuItem == 'Load info.'}">
        <h:commandButton value="Button 2" />
    </h:form>
</h:panelGroup>

<h:panelGroup id="viewFiles">
    <h:form id="viewFilesForm" rendered="#{menu.mainMenuItem == 'View files.'}">
        <h:commandButton value="Button 3" />
    </h:form>
</h:panelGroup>

这是另一种方式(如果表格之间实际上没有待更新的内容,我建议更多):

<h:form id="menuForm">
    <h:outputLabel for="menu">Available actions: </h:outputLabel>
    <h:selectOneMenu id="menu" value="#{menu.mainMenuItem}">
        <f:selectItem itemLabel="Select an option..." itemValue="null" />
        <f:selectItems value="#{menu.mainMenuItems}" />
        <f:ajax render=":menuForm :otherForms :adminUsersForm :loadInfoForm :viewFilesForm" />
    </h:selectOneMenu>
</h:form>

<h:panelGroup id="otherForms">
    <h:form id="adminUsersForm" rendered="#{menu.mainMenuItem == 'Admin users.'}">
        <h:commandButton value="Button 1" />
    </h:form>

    <h:form id="loadInfoForm" rendered="#{menu.mainMenuItem == 'Load info.'}">
        <h:commandButton value="Button 2" />
    </h:form>

    <h:form id="viewFilesForm" rendered="#{menu.mainMenuItem == 'View files.'}">
        <h:commandButton value="Button 3" />
    </h:form>
</h:panelGroup>

请注意,在这两种方式中我都包含了render中所有其他表单的ID。这是解决JSF Ajax JavaScript中的一个错误(将在JSF 2.2中修复)。有关详细说明,另请参阅Ajax rendering of content which contains another form