12

我如何有条件地渲染一个<ui:define>

模板中的数据取决于所需的<f:viewParam>.

但是如果提供了无效的视图参数,则<ui:define>不应呈现,因为应使用模板的默认内容。

我尝试使用<c:if>但它不起作用。

4

2 回答 2

12

不可能有条件地渲染/构建<ui:define>. 你只能为它的内容做。<ui:define>模板中忽略外部的任何内容。

更好的是有条件地构建<ui:insert>。在<ui:insert>视图构建期间运行,因此无法通过通过设置的属性有条件地呈现它<f:viewParam>。您只能<ui:insert>使用条件视图构建时间标签(例如 JSTL)有条件地构建它(标签本身),而 JSTL<c:if>反过来又直接检查原始请求参数(因此不检查<f:viewParam>属性)。

在主模板中,它看起来像这样,假设仅存在请求参数就足够了(如果您需要执行验证,则需要在 EL 表达式中或在托管 bean 中进行,其中属性通过 预初始化@ManagedProperty("#{param.foo}")

例如,在主模板中:

<c:if test="#{not empty param.foo}">
    <ui:insert name="content" />
</c:if>
<c:if test="#{empty param.foo}">
    <p>Default content</p>
</c:if>

或者,更清晰但更详细

<c:choose>
    <c:when test="#{not empty param.foo}">
        <ui:insert name="content" />
    </c:when>
    <c:otherwise>
        <p>Default content</p>
    </c:otherwise>
</c:choose>

也可以看看:

于 2012-12-21T04:51:11.727 回答
1

改为使用<ui:fragment>

<ui:define name="description">
    <ui:fragment rendered="false">
        <meta name="description" content="do not render" />
    </ui:fragment>
</ui:define>

重复的ui:define 与 render="false" 属性仍在渲染

于 2017-03-23T20:47:54.467 回答