【问题标题】:How to invoke p:commandButton in the error page shown by FullAjaxExceptionHandler?FullAjaxExceptionHandler显示的错误页面如何调用p:commandButton?
【发布时间】:2012-12-25 17:17:46
【问题描述】:

我正在使用OmniFaces FullAjaxExceptionHandler 和 PrimeFaces。我在errorPage.xhtml中添加了一个命令按钮如下:

<h:form>
    <p:commandButton id="logoutButtonId" value="Redirect" actionListener="#{userMB.logout()}">
</h:form>

错误页面正确显示,但按钮未触发方法#{userMB.logout()}。 这就是我所理解的设置中发生的情况:

  1. 如果发生错误,FullAjaxExceptionHandler 会很好地显示 errorPage.xhtml
  2. 如果我点击我添加的按钮,页面会使用相同的数据进行更新,就像发生了刷新一样。
  3. 如果我再次单击该按钮,则会触发托管 bean 方法。

只有在第二次单击时才会调用 bean 方法。似乎在第一次加载时,bean 方法没有绑定到对象。

当使用FullAjaxExceptionHandler 时,如何实现在错误页面中添加命令按钮,并将动作/动作侦听器正确绑定到 HTML 组件?

【问题讨论】:

  • 您好,我看到您试图通过编辑发表评论。这不是它在这里的工作方式。添加 cmets 应通过“添加评论”链接完成。
  • @BalusC,谢谢你,我是个新手。您能否解释一下“请注意,这些脚本需要放在调用 ajax 操作的页面上,而不是放在错误页面本身上。”我的困境是我想在错误页面中添加一个按钮,因此在错误页面中调用该操作?提前致谢!
  • 导致异常的页面。这些脚本应该在 ajax 异常处理期间执行。请注意,每个答案还有一个“添加评论”链接。
  • 当显示错误页面时,我可以在部分响应中看到视图状态 ID,但尽管包含脚本,但隐藏的输入并未被添加。它只会在第二次点击时添加。我还能错过什么?
  • 好的,让我们先说清楚。您有 2 个页面:A 和 B。页面 A 中的 ajax 请求会导致异常。页 B 是错误页。脚本应该在页面 A 中加载。您确定是这种情况吗?需要更多信息来确定问题:1)您在页面 A 中使用什么来触发 ajax 请求? &lt;f:ajax&gt; 或者来自 PrimeFaces 的东西? 2)您使用的是哪种浏览器? IE还是其他?

标签: jsf primefaces action omnifaces


【解决方案1】:

这对我有用,结合了 BalusC 在下面的回答中提到的方法。它适用于 IE 和 Firefox。在某些情况下可能需要进行一些调整,但由于我得到的错误页面只有一个表单,所以我没有费心循环表单。

var originalPrimeFacesAjaxResponseFunction = PrimeFaces.ajax.AjaxResponse;
PrimeFaces.ajax.AjaxResponse = function(responseXML) {
    var newViewRoot = $(responseXML.documentElement).find("update[id='javax.faces.ViewRoot']").text();

    if (newViewRoot) {
        var viewState = $(responseXML.documentElement).find("update[id='javax.faces.ViewState']").text();

        $('head').html(newViewRoot.substring(newViewRoot.indexOf("<head>") + 6, newViewRoot.indexOf("</head>")));
        $('body').html(newViewRoot.substring(newViewRoot.indexOf("<body>") + 6, newViewRoot.indexOf("</body>")));
        if (!$('input').attr("javax.faces.ViewState")){
            var hidden = document.createElement("input");
            hidden.setAttribute("type", "hidden");
            hidden.setAttribute("name", "javax.faces.ViewState");
            hidden.setAttribute("value", viewState);
            hidden.setAttribute("autocomplete", "off");
            $('form').append(hidden);
        }
    } else {
        originalPrimeFacesAjaxResponseFunction.apply(this, arguments);
    }
};

【讨论】:

  • 带有 viewState 的隐藏输入也需要正确的 id。没有它,ajax 请求将无法工作。 hidden.setAttribute("id", "javax.faces.ViewState");
【解决方案2】:

这个问题有两个可能的原因:

  1. 如果您使用的是 Internet Explorer,则可以识别为 PrimeFaces @all 无法在基于 IE 的浏览器中初始化必要的 ajax javascript。答案在这里:Object doesn't support this property or method with primefaces omnifaces timeout combination

  2. 1234563一个@all。答案在这里:Bug report form on error page

请注意,这些脚本需要放置在调用 ajax 操作的页面上,而不是错误页面本身。

【讨论】:

  • 上述解决方案的组合对我有用。感谢您耐心地尝试了解正在发生的事情。我用 IE 和 FF 对其进行了测试,并且该方法有效,我将把它放在一个单独的答案中,因为评论不会让我长篇大论......对不起,这是新的。
猜你喜欢
  • 2013-06-22
  • 2017-06-20
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 2012-06-28
  • 2020-01-21
  • 2015-12-07
  • 1970-01-01
相关资源
最近更新 更多