Ajax JSF2.0,未在bean中更新部分呈现的表单字段输入值
我有一个编辑产品表单,它预先填充了DB中的值。用户可以更改一个或多个值并将表单发回。如果用户选择更改产品图像,则只有在ajax请求后才会呈现一个名为t:inputFileUpload的输入字段。在通过保存按钮最后回发编辑表单期间,bean不会使用t:inputFileUpload字段的值进行更新。表单的相关部分如下:Ajax JSF2.0,未在bean中更新部分呈现的表单字段输入值,ajax,jsf,javabeans,Ajax,Jsf,Javabeans,我有一个编辑产品表单,它预先填充了DB中的值。用户可以更改一个或多个值并将表单发回。如果用户选择更改产品图像,则只有在ajax请求后才会呈现一个名为t:inputFileUpload的输入字段。在通过保存按钮最后回发编辑表单期间,bean不会使用t:inputFileUpload字段的值进行更新。表单的相关部分如下: <h:form> <tr> <td>Product Im
<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>
我读过一些类似的问题,其中一些问题的答案是将bean的viewscope设置为可见范围。我尝试过将bean的viewscope设置为可见范围,但这打破了我最初预填充表单值的逻辑。由于我对RequestScope很满意,所以如果editImgChange标志的关闭会影响t:inputFileUpload的更新,那么我已经保存了该标志的状态。当我查看bean属性all is fine时,标志为true,但uploadedFile属性为null。根据注释,您使用
保存状态。这是行不通的。呈现的
属性在应用请求值阶段进行评估,而该隐藏值在更新模型值阶段可用,因此为时已晚
既然您已经在使用战斧,请改用
。或者,修复使bean视图具有作用域时遇到的问题。我不明白为什么那会是个问题。也许您正在使用@PostConstruct
,并期望在每个请求中都调用它。然后应改用
。如何准确保存editImgChange
标志的状态?使用上述表单中panelGroup内的InAuthidden标记。值的绑定方式如何?通过binding
或value
?我使用了value标记,因此我相信值是通过value绑定的。因为你在看到我问题中的value标签后就特别问了这个问题,我感到困惑。
是唯一有效的方法,但这需要对bean的构造函数和/或其getter/setter方法进行笨拙的破解。使用
或@ViewScoped
更干净。另请参见我的答案。t:saveState帮助了我们。非常感谢。关于viewscope,我要找出哪里出了问题。我没有使用@PostConstruct。
@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
}
}