我有一个通用的布局,默认情况下,应该在每个页面上显示一个(基本的)搜索表单,除了搜索页面本身已经包含一个(更高级的)搜索表单。
为了不显示默认的搜索表单,是否可以从我的搜索页面向布局传递一个参数?
以下是我想做的一个例子:
布局. html
<html layout:???="displayShowForm = true">
...
<form action="search" th:if="${displayShowForm}">...</form>
...
<div layout:fragment="content">...</div>
home. html(显示默认搜索表单)
<html layout:decorator="layout">
...
<div layout:fragment="content">...</div>
search. html(隐藏默认搜索表单)
<html layout:decorator="layout (displayShowForm = false)">
...
<div layout:fragment="content">
...
<form action="advancedSearch">...</form>
是的,这是完全可能的,尽管Thymeleaf的留档没有明确说明。
您所要做的就是使用th: with属性传递参数。可能还有其他方法,但这似乎是最直接的。
这是我实现的精简版本:
默认装饰器-片段/布局/default. html
<!doctype html>
<html xmlns:layout="http://www.thymeleaf.org" xmlns:th="http://www.thymeleaf.org">
<body>
<div th:replace="fragments/header :: main"></div>
<div layout:fragment="content">
main content goes here
</div>
</body>
</html>
标题片段-片段/header. html
<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div th:fragment="main">
<nav>
<ul>
<li><a href="#" th:classappend="${currentPage == 'home'} ? 'active'">Home Page</a></li>
<li><a href="#" th:classappend="${currentPage == 'about'} ? 'active'">About</a></li>
</ul>
</nav>
</div>
</body>
主页文件-home. html
<!doctype html>
<html layout:decorator="layout/default" th:with="currentPage='home'"
xmlns:layout="http://www.thymeleaf.org/" xmlns:th="http://www.thymeleaf.org">
<body>
<div layout:fragment="content">
This is my home page content... thrilling, isn't it?
</div>
</body>
</html>
在这里,在home. html文件中,您可以看到我包含默认装饰器并使用th:with属性传递我的参数。我实际上并没有在我的布局装饰器中使用我的参数,但我在header.html中使用它,它包含在装饰器中。不需要将它从装饰器传递到header.html片段,因为它已经在范围内。
也不需要对header. html中的当前页面变量进行NULL检查。从home.html中删除参数时,活动CSS类根本没有附加。
如果我要渲染home. html,我希望看到以下输出:
<!doctype html>
<html>
<body>
<nav>
<ul>
<li><a href="#" class="active">Home Page</a></li>
<li><a href="#">About</a></li>
</ul>
</nav>
<div>
This is my home page content... thrilling, isn't it?
</div>
</body>
</html>
是的,可以传递参数,但您需要使用布局:include
而不是布局:装饰器
或布局:片段
。
类似于Thymeleaf的th: include
,但允许将整个元素片段传递到包含的页面。如果您有一些想要重用的超文本标记语言,但其内容过于复杂而无法单独使用上下文变量来确定或构造,则很有用。
来源:https://github.com/ultraq/thymeleaf-layout-dialect
你应该看看这个留档,它会给你详细的使用方法。
在您的情况下,它可能看起来像:
<div layout:include="form" th:with="displayShowForm=true"></div>
并且在form
的布局页面中:
<div layout:fragment="form">
<div th:if="${displayShowForm} == true">
<form action="basicSearch"></form>
</div>
<div th:if="${displayShowForm} == false">
<form action="advancedSearch"></form>
</div>
</div>