gpt4 book ai didi

jsf - h :body not rerendered when using FullAjaxExceptionHandler

转载 作者:行者123 更新时间:2023-12-04 19:31:55 25 4
gpt4 key购买 nike

我正在使用 OmniFaces FullAjaxExceptionHandler显示错误页面。错误页面显示正确,但这些页面的样式有问题。

我的应用程序使用的模板在 body 元素上定义了 CSS 类。这些类对于正常页面和错误页面是不同的:

普通页面:

<h:body styleClass="main-body layout-compact">

错误页面:
<h:body styleClass="exception-body error-page">

当 FullAjaxExceptionHandler 处理异常时,会执行到错误页面的转发(基于 <error-page> 中的 web.xml 机制)。显然这不会重新渲染 <h:body>标签,因为在检查HTML输出时,我可以看到 <body>标签仍然包含来自正常页面的 CSS 类(而不是错误页面的类)。

原来 <h:body>的内容好像替换为错误页面的内容 <h:body>而不是仅仅替换完整的 <h:body> .我不知道这是否是默认的 JSF/FullAjaxExceptionHandler 行为。

有什么办法可以拥有 <h:body>使用正确的 CSS 类呈现?将 CSS 类从 <h:body> 移开不是一个选择。

最佳答案

不幸的是,这是“设计使然”。 JSF 在执行 ajax 导航时不会替换整个文档,但它只会替换单个 <head> 的子元素。和 <body>元素,让 parent 保持不变。这样做是出于历史原因;较旧的 Internet Explorer 版本即不支持完全替换它们。

我自己做的就是简单的把样式放进<main>元素代替。 <header><footer>在最终的 HTML 输出中通常是相同的。基本上:

<html>
<head>
<title>...</title>
</head>
<body>
<header>...</header>
<main class="#{page.type}">...</main>
<footer>...</footer>
</body>
</html>

如果您真的需要 <body class>修改,那么最好的办法是通过嵌入在错误页面模板中的 JavaScript 来实现。
<h:outputScript rendered="#{faces.ajaxRequest}">
document.body.className = "exception-body error-page";
</h:outputScript>

注: #{faces}仅自 OmniFaces 2.5 起可用,如果您使用旧版本,请改用 #{facesContext.partialViewContext.ajaxRequest} )。

关于jsf - h :body not rerendered when using FullAjaxExceptionHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43224613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com