我有一个编辑产品表单,预先填充了DB中的值。用户可以更改一个或多个值并将表单发回。一个名为t:inputFileUpload的输入字段仅在ajax请求之后呈现,如果用户选择更改产品图像。在编辑表单的最终回发期间,通过保存按钮,bean不会使用t的值更新:inputFileUpload field 。表格的相关部分如下:
<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 render="uploadimage" execute="@this" listener="#{addItem.ChangeImage}"/>
</h:commandLink>
</td>
</tr>
<tr >
<td>
<h:panelGroup id="uploadimage">
<t:inputFileUpload rendered="#{addItem.editImgChange}" label="editImage" value="#{addItem.uploadedFile}" />
<h:messages for="prodimage"/>
<h:inputHidden id="hiddeneditimgchange" value="#{addItem.editImgChange}" />
</h:panelGroup>
</td>
</tr>
<h:commandButton value="save" action="#{addItem.EditItem}" />
</h:form>
AddItem bean是请求作用域,其代码的相关部分是:
@ManagedBean
public class AddItem extends AbstractBean{
boolean editImgChange;
private UploadedFile uploadedFile;
//..
//getters and setters
public void ChangeImage(){
this.editImgChange=true;
}
public String EditItem() {
//some logic
}
}
我已经阅读了一些类似的问题,其中一些答案是使bean视图编译。我已经尝试使bean ViewScoped,但它打破了我预先填充表单值的初始逻辑。由于我对RequestScoped感到满意,因此我保存了editImgChange标志的状态,如果它关闭正在影响t:inputFileUpload的更新。当我查看bean属性一切正常时,标志为true,但uploadedFile属性为null。
答案 0 :(得分:2)
根据评论,您使用<h:inputHidden value="#{addItem.editImgChange}" />
来保存状态。这不会起作用。在应用请求值阶段期间评估rendered
属性,而在更新模型值阶段期间使该隐藏值可用,因此为时已晚。
由于您已经在使用战斧,请改用<t:saveState value="#{addItem.editImgChange}" />
。或者,只修复在使bean视图作用域时遇到的问题。我不预见为什么那会是一个问题。也许你正在使用@PostConstruct
并期望它在每个请求上被调用。然后,您应该使用<f:event type="preRenderView">
代替。