我的应用程序有一个模态面板,用户可以在其中上传文件并在下拉选择中选择“文档类型”。
我在上传活动期间使用<f:setPropertyActionListener>
设置了文档类型值,但有时在处理完上传后设置属性。可能它正在发生,因为正在生成另一个请求,并且此请求由另一个Web容器线程处理。
<rich:modalPanel id="attachFiles" autosized="true">
<h:form id="formUpload" enctype="multipart/form-data">
<h:selectOneMenu id="docType" value="#{myMB.docType}" required="true" >
<f:selectItems value="#{myMB.docTypesSelectItems}" />
</h:selectOneMenu>`
<rich:fileUpload id="upload" fileUploadListener="#{myMB.handleUpload}">
<a4j:support event="onupload">
<f:setPropertyActionListener value="#{myMB.docType}"
target="#{myMB.docType}" />
</a4j:support>
</rich:fileUpload>
</rich:modalPanel>
当它发生时,myMB.docType
的值在执行myMB.handleUpload
期间为空,这是预期的,因为该字段应该是必需的。
有没有办法确保方法myMB.handleUpload
仅在 docType
的属性设置后才执行?
答案 0 :(得分:1)
我有类似的问题。
更改
<a4j:support event="onupload">
到
<a4j:support event="onclick">
设置文档类型操作将在上载文件之前执行。究竟何时打开资源管理器文件系统
答案 1 :(得分:0)
<f:setPropertyActionListener value="#{myMB.docType}" target="#{myMB.docType}" />
我不懂你的意思。目标与值相同。你基本上是用自己设定目标的价值。价值本身不仅仅是null
吗?
无论如何,我不做RichFaces,所以我不能详细介绍,但是我知道它正在使用Flash上传组件,并且这样的构造通常会激发一个单独的(和独立的)请求不会考虑所有其他HTML表单参数。此后,“正常”JSF输入在单独的HTTP请求中。所以你有点迷失在这里而没有带来一些令人讨厌的JS / ajax黑客。至少在理论上。
你最好的办法是在监听器方法中将上传的文件作为bean属性保存,然后在普通bean的action方法中进一步处理(以同一形式连接到某个UICommand
组件的方法)
答案 2 :(得分:0)
我会将Ajax功能添加到select组件中。这样,每次用户更改select的值时,都会立即更新bean值。在文件上传方法中,您可以依靠bean值来表示用户所做的最新选择。
您只需要处理用户启动文件上传而不触及选择的情况。您需要具有合理的默认值,否则您必须处理非选择并在上传文件之前以某种方式使选择字段。