当我尝试在 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