【问题标题】:PreRenderView skipping button action after browser back浏览器返回后 PreRenderView 跳过按钮操作
【发布时间】:2013-09-06 21:32:16
【问题描述】:

我有一个带有“显示更多结果”按钮的搜索结果页面。支持 bean 是会话范围的,我们使用 preRenderView 来执行支持 bean 中的搜索方法:

<f:event type="preRenderView" listener="#{SearchBean.searchSolutions}" />

“显示更多结果”按钮的定义如下:

<h:commandButton action="#{SearchBean.onClickShowMoreResults()}">
    <f:ajax disabled="false" render=":searchResultsForm"/>
</h:commandButton>

这是我遇到的问题和重现的步骤:

  1. 执行搜索。
  2. 点击进入结果页面的搜索结果。
  3. 使用浏览器的后退按钮。
  4. 点击“显示更多结果”按钮。
  5. 问题 --> 未调用 onClickShowMoreResults() 函数,而是调用了 searchSolutions() 侦听器方法(这种情况间歇性发生,大多数情况下该函数被正确调用,一旦我遇到问题,一切正常每次都可以通过步骤 2 到 4 重现它,而无需开始新的搜索)。

我尝试在侦听器方法中跳过 ajax 请求(如 here 解释的那样)并解决了问题,但这对我来说是不可能的,因为有需要执行侦听器方法的 ajax 请求(更改搜索条件) .

我对 preRenderView 有什么不明白的地方,还是有其他方法可以实现我想要做的事情?

感谢您的帮助!

【问题讨论】:

  • 您是否查看了 ajax 响应正文?你在里面看到ViewExpiredException了吗?
  • @BalusC 我没有在控制台中抛出异常。如何访问 ajax 响应正文?
  • 只需查看浏览器内置的 HTTP 流量监控器即可。在 Chrome/Firefox(Firebug)/IE>=9 中按 F12 打开 Web 开发者工具,然后查看“Net”或“Network”选项卡。
  • @BalusC 感谢您的提示,但我认为那里没有例外。此外,我意识到一旦遇到问题,我可以在每次执行步骤 2->4 时重现它,而无需开始新的搜索。
  • 也许this可以帮助你

标签: jquery ajax jsf back-button prerenderview


【解决方案1】:

由于没有得到答复,因此我找到了解决此问题的方法。

我确保没有对侦听器方法的 ajax 调用(做一些牺牲)并在 this 线程中使用了 BalusC 的答案。

使用:

if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) { 
       return; // Skip ajax requests.
}

在监听器方法中解决了这个问题。

【讨论】:

  • 当然,但是您说这种情况是间歇性发生的,这使得上述答案几乎无法回答这个问题,因为这实际上并不能解决“间歇性”部分。 preRenderView 应该总是每个单个 HTTP 请求上调用。还是说“断断续续”只是一种误会?
  • 它确实会间歇性地发生(问题有时会在尝试 5 次后发生,有时会更多,否则效果很好)......并且此解决方案阻止了在侦听器方法中完成的新搜索。我不明白的是为什么“显示更多”操作即使没有进入方法仍然会完成。
  • 我忘了说的是,我们在侦听器方法中有一个布尔条件,当我们需要时会跳过搜索(这可能是一种不好的方法,但这就是我正在使用的方法..)。而当问题发生时,由于没有进入 ShowMore 方法,所以 boolean 为 true 并执行 listener 方法中的所有代码。
猜你喜欢
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2021-08-28
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多