JSF 2.0,部分呈现的表单字段输入值未在bean中更新

时间:2011-09-27 09:01:30

标签: ajax jsf javabeans

我有一个编辑产品表单,预先填充了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。

1 个答案:

答案 0 :(得分:2)

根据评论,您使用<h:inputHidden value="#{addItem.editImgChange}" />来保存状态。这不会起作用。在应用请求值阶段期间评估rendered属性,而在更新模型值阶段期间使该隐藏值可用,因此为时已晚。

由于您已经在使用战斧,请改用<t:saveState value="#{addItem.editImgChange}" />。或者,只修复在使bean视图作用域时遇到的问题。我不预见为什么那会是一个问题。也许你正在使用@PostConstruct并期望它在每个请求上被调用。然后,您应该使用<f:event type="preRenderView">代替。