【问题标题】:Conditionally render ui:define有条件地渲染 ui:define
【发布时间】:2012-11-20 12:07:27
【问题描述】:

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

模板中的数据取决于一个必需的<f:viewParam>

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

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

【问题讨论】:

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

标签: jsf facelets templating conditional-rendering


【解决方案1】:

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

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

另见:

【讨论】:

  • 哦,伙计,使用新的请求 bean 进行验证似乎是一个很大的解决方法,因为我确实需要验证。我喜欢 jsf,但是你从构建应用程序开始就没有想到的许多事情并不是那么直接实施。
  • 不小心把赏金给了快。我使用请求范围的 bean 对其进行了测试,以便按照您的建议使用 @ManagedProperty 进行验证,但它永远不会被调用。减少它以测试原始请求参数&lt;c:if test="#{not empty param.id}"&gt;&lt;ui:define name="name"&gt;content&lt;/ui:define&gt;&lt;/c:if&gt; 不起作用。没有渲染任何内容。
  • 什么 JSF impl/version?我使用的是 Mojarra 2.1.16。您是否正确声明了 JSTL c XML 命名空间?
  • 哦,我现在看到您正在尝试有条件地构建 &lt;ui:define&gt;。这确实行不通。您应该有条件地构建&lt;ui:insert&gt;,正如我的回答所示。
  • 嗯,你的回答也让我感到困惑,因为你在谈论&lt;ui:define&gt;,但你的例子是&lt;ui:insert&gt;。很高兴知道这是不可能的。
【解决方案2】:

请改用&lt;ui:fragment&gt;

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

ui:define with rendered="false" attribute still rendering 的副本

【讨论】:

    猜你喜欢
    • 2011-06-03
    • 2018-06-30
    • 2014-11-26
    • 2019-03-24
    • 2013-05-01
    • 1970-01-01
    • 2018-09-13
    • 2019-02-18
    • 1970-01-01
    相关资源
    最近更新 更多