ajax在multipart / form-data表单上更改目标属性

时间:2014-07-16 04:03:14

标签: ajax jsf mojarra

当我尝试在 multipart / form-data 表单中使用f:ajax呈现组件时,表单的目标属性将更改为 JSFFrameId 即可。这是一个错误吗?

以下是发生这种情况时的示例代码:

<h:form enctype="multipart/form-data">
    <h:inputText>
        <f:ajax event="change" render="@this" execute="@this"/>
    </h:inputText>
    <h:inputFile />
</h:form>

在我的真实代码中,这不是我尝试做的事情,但样本代码也出现了同样的问题。

访问此页面时,我得到以下HTML输出:

<form id="form" name="form" method="post" action="/AdApp/faces/test.xhtml" enctype="multipart/form-data">
    <input type="hidden" name="form" value="form">
    <input id="form-textfield" type="text" name="form-textfield" onchange="mojarra.ab(this,event,'change','@this','@this')">
    <input id="form-filefield" type="file" name="form-filefield">
    <input type="hidden" name="javax.faces.ViewState" id="j_id1-javax.faces.ViewState-0" value="-1920816151200438245:-3719618601043085373" autocomplete="off">
</form>

这里没有错。但是当ajax事件触发时,这就是HTML输出(我的问题?表单的target属性)所发生的事情:

<form id="form" name="form" target="JSFFrameId" method="POST" action="http://DOMAIN_PATH/AdApp/faces/test.xhtml" enctype="multipart/form-data">
    <input type="hidden" name="form" value="form">
    <input id="form-textfield" type="text" name="form-textfield" onchange="mojarra.ab(this,event,'change','@this','@this')">
    <input id="form-filefield" type="file" name="form-filefield">
    <input type="hidden" name="javax.faces.ViewState" id="j_id1-javax.faces.ViewState-0" value="-1920816151200438245:-3719618601043085373" autocomplete="off">
</form>
<iframe src="about:blank" id="JSFFrameId" name="JSFFrameId" width="0" height="0" frameborder="0">
    <partial-response id="j_id1">
        <changes>
            <update id="form-textfield">
                <![CDATA[<input id="form-textfield" type="text" name="form-textfield" value="das" onchange="mojarra.ab(this,event,'change','@this','@this')" />]]>
            </update>
            <update id="j_id1-javax.faces.ViewState-0">
                <![CDATA[-1920816151200438245:-3719618601043085373]]>
            </update>
        </changes>
    </partial-response>
</iframe>

我不关心iframe记录变化的情况。我的问题是表格的目标已经改变。因此,在ajax事件触发后,提交将以隐藏的iframe为目标,而不是窗口本身。

如果我删除 enctype 属性或将ajax设置为渲染 @form ,则不会更改目标属性。我需要 enctype =&#34; multipart / form-data&#34; 来上传文件,我不想使用 render =&#34; @ form&#34; 因为我的真实表单中的某些内容可能已被javascript代码修改。我错过了什么吗?还是只是bug?我将添加一些javascript来删除目标属性,但如果我做错了,我应该使用另一种方法。

我使用以下工具:

Netbeans IDE 8

Glassfish 4与Mojarra 2.2.7

1 个答案:

答案 0 :(得分:0)

似乎有一对(284330183048)与fileuploads和ajax-reloads相关的错误。它们都被标记为各种版本的解析(JSF 2.2.1和2.2.5)。我在2.2.3,我不负责JSF版本,所以我坚持这一点。我在我的开发机器上尝试了2.2.8,但仍然可以重现这个问题。

和您一样,我也发现使用render="@form"会导致更改消失的问题。但是,如果我还添加execute="@form",则更改将存储在bean中,并在呈现后保持可见。