问题 有条件地渲染ui:define


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

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

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

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


13153
2017-12-03 02:10


起源

EL通常是空安全的,因此空值应仅评估为空,而不是抛出NPE。您仍然获得NPE表明您正在使用getter进行业务逻辑。这是真的?你必须在那里解决这个问题。 - BalusC
我也在数据实例上调用一些自定义el函数。但我还是想显示模板的默认内容。 - djmj
如果没有解决方案,我应该为jsf提交增强问题吗? - djmj


答案:


无法有条件地渲染/构建 <ui:define>。你只能为它的内容做。外面的一切 <ui:define> 在模板中被忽略。

更好的是有条件地建立 <ui:insert> 代替。该 <ui:insert> 在视图构建时运行,因此无法通过设置的属性有条件地呈现它 <f:viewParam>。你只能有条件地建立它( <ui:insert> 标记本身)使用条件视图构建时间标记,如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>

也可以看看:


12
2017-12-21 04:51



哦,使用新请求bean进行验证的人似乎是一个很大的解决方法,因为我绝对需要验证。我喜欢jsf,但是你从开始构建应用程序时想到的很多东西并不是那么直接实现的。 - djmj
很快就获得了赏金。我使用请求范围的bean测试它以进行验证 @ManagedProperty 正如你所建议但它永远不会被调用。减少它以测试原始请求参数 <c:if test="#{not empty param.id}"><ui:define name="name">content</ui:define></c:if> 不管用。什么都没有呈现。 - djmj
什么JSF impl /版本?我使用的是Mojarra 2.1.16。你有没有正确宣布JSTL c XML命名空间? - BalusC
使用Mojarra 2.1.14 - djmj
哦,我现在看到你正试图有条件地建造 <ui:define>。这确实行不通。你应该有条件地建立 <ui:insert>,正如我的回答所示。 - BalusC


使用 <ui:fragment> 代替。

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

重复 ui:define with rendered =“false”属性仍然呈现


1
2018-03-23 20:47