2

每当我进行 ajax 调用时,我的 URL 参数都会过期。我所做的解决方法是在每个按钮内传递一个参数请求,例如:

<p:commandLink value="Submit" actionListener="#{mybean.dosomething}">
   <f:param name="foo" value="#{mybean.bar}"/>
</p:commandLink>

但是,在某些情况下,我无法执行上述解决方法。例如,当我使用 primefaces rowEditEvent 时:

<p:ajax event="rowEditCancel" listener="#{mybean.onCancel}"/>

当我进行此 ajax 调用时,该参数过期,并在调用之前导致错误,#{mybean.onCance}因为我正在从 URL 中的参数读取数据表的数据。

那么当我进行这样的 ajax 调用时,如何维护参数值呢?

PS:mybean 是 ViewScoped

问题扩展:

已经解决了<o:form>部分问题,但现在我无法在表格内发送参数以在表格内进行动态图像流。请参阅以下内容:

<p:dataTable value="#{mybean.data}" var="var">
    <p:column headerText="Thumbnail">
        <p:graphicImage value="#{streamer.thumbnail}">
            <f:param name="id" value="#{var.id}"/>
        </p:graphicImage>
    </p:column>
</p:dataTable>

Streamer Bean (RequestScoped):

 public StreamedContent getThumbnail() throws IOException {
      FacesContext context = FacesContext.getCurrentInstance();
      if (context.getRenderResponse()) {
          return new DefaultStreamedContent();
      }
      else {
         String string = context.getExternalContext().getRequestParameterMap().get("id");
        Long id = Long.parseLong(idString);
        MyImage img = (MyImage) service.find(MyImage.class, id);//get resource
        StreamedContent sc = new DefaultStreamedContent(img.getInputStream(), "image/jpg", img.getName());
        return sc;
        }
 }

这里string始终为空且未传递参数导致错误

4

1 回答 1

4

将其注册为<f:viewParam>

<f:viewParam name="foo" value="#{mybean.bar}" />

而不是<h:form>, 使用OmniFaces (它在幕后使用自定义<o:form>实现,该实现自动收集所有视图参数并将它们附加到用作表单操作 URL 的方法的结果):includeViewParams="true"ViewHandlergetActionURL()

<o:form includeViewParams="true">
    ...
</o:form>

<f:param>这样,所有视图参数都包含在表单的操作 URL 中,因此将以通常的方式作为请求参数结束,而无需在内部<p:ajax>(and )摆弄和毫无头绪<f:ajax>

于 2013-02-06T18:24:06.767 回答