【问题标题】:p:fileUpload inside p:dialog losing @ViewScoped values [duplicate]p:fileUpload 在 p:dialog 中丢失 @ViewScoped 值 [重复]
【发布时间】:2015-02-21 00:45:03
【问题描述】:

我正在尝试使用<p:fileUpload> 更新多个文件。上传文件后,我设置了一个列表,其中的路径可以正常工作。

之后,用户必须填写一些其他可选信息,然后单击按钮(提交表单)。

当用户点击按钮时,所有在public void handleFileUpload(FileUploadEvent event) 上完成的列表信息都会丢失。

只有当用户单击按钮时,我才需要将路径保存在数据库中,我不明白为什么值会丢失,我正在使用@javax.faces.view.ViewScoped

此外,在处理handleFileUpload 时,用户在屏幕上所做的输入尚不可用。

  • JSF 2.2
  • CDI
  • PrimeFaces 5.1

我将省略下面代码中的某些部分以避免使其变得庞大(如果您认为没有足够的信息,请告诉我)

XHTML:

<h:form>
    <!-- OMITED -->
    <p:dialog>
        <!-- OMITED -->
        <p:fileUpload fileUploadListener="#{csrBean.handleFileUpload}"
            mode="advanced"
            skinSimple="true"
            cancelLabel="Cancelar"
            multiple="true"
            auto="false"/>
        <!-- OMITED -->
    </p:dialog>
    <!-- OMITED -->
</h:form>

方法:

public void handleFileUpload(FileUploadEvent event) {
    UploadedFile file = event.getFile();
    String normalize = FilenameUtils.normalize("uploads/csr/"
            + csr.getNumero() + "/" + event.getFile().getFileName());
    File destino = new File(normalize);
    try {
        FileUtils.copyInputStreamToFile(file.getInputstream(), destino);
    } catch (IOException e) {
        e.printStackTrace();
    }

    CsrOsAnexo anexo = new CsrOsAnexo();
    anexo.setCaminho(normalize);
    anexo.setOs(csr.getRespostaRecente().getOs());      
    csr.getRespostaRecente().getOs().getAnexoList().add(anexo);


    FacesMessage message = new FacesMessage("Succesful", event.getFile()
            .getFileName() + " is uploaded.");
    FacesContext.getCurrentInstance().addMessage(null, message);
}

调试,我可以看到csr.getRespostaRecente().getOs().getAnexoList() 填充了所有存档路径,但是一旦handleFileUpload() 结束并且我转到commandButton 调用的方法,这些值就消失了,表单的值也被填充了.

【问题讨论】:

    标签: jsf primefaces dialog view-scope


    【解决方案1】:

    模态对话框必须有自己的形式。

    <h:body>
        ...
        <p:dialog>
            <h:form>
                ...
            </h:form>
        </p:dialog>
    </h:body>
    

    因为,当模态对话框生成到 HTML 输出时,它是由 JavaScript 重新定位到 HTML &lt;body&gt; 的末尾,这导致它不再以任何形式出现。这种重新定位对于保证与旧浏览器(阅读:IE

    <body>
        ...
        <form>
            ...
        </form>
        ...
        <div class="ui-dialog ...">
            ...
        </div>
    </body>
    

    文件上传显然在没有表单的情况下仍然有效,因为它会自动创建一个隐藏的 iframe,其中包含一个表单来模拟“ajax 体验”。但是,任何其他操作基本上都会丢失 JSF 视图状态,因此任何视图范围的 bean 都会被重新创建。

    【讨论】:

    • 完美,很有魅力,谢谢
    猜你喜欢
    • 2013-05-16
    • 2018-02-21
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2018-03-19
    • 2015-11-10
    相关资源
    最近更新 更多