【问题标题】:Razor: Retrieving variable from component template on page templateRazor:从页面模板上的组件模板中检索变量
【发布时间】:2012-11-25 13:30:20
【问题描述】:

大家好, 我一直在研究一组 Razor 模板,它们既可以使用 Experience Manager 进行站点编辑,又可以使用 Twitter 引导程序完全响应多个屏幕宽度。因此,我需要根据 Experience Manager 编辑器添加或删除的内容动态操作 DOM 输出,但仍保持响应式设计。这种结构的一部分是遵守 twitter bootstrap 规定的规则。

twitter 引导程序通过使用类引入动态计算的 div 宽度来实现出色的responsive design。例如,<div class="span12> 使用包装器的整个宽度。 “span6”有效地使用了一半,并计算了一定的边距以允许另一个具有“span6”的 div。但是,这只有在前面的类被称为<div class="row-fluid"> 时才有效,并且只要 span<numbers> 实际上加起来正好是 12。当我需要在实际达到这个数字时关闭 <div class="row-fluid"> 时,就会出现问题。

澄清一下:它必须像这样输出

<div class="row-fluid">
    <div class="span6">..code</div>
    <div class="span4">..code</div>
    <div class="span2">..code</div>
</div>

&lt;div class="span[#]"&gt; 使用 组件模板 呈现,以便在 页面模板 呈现的 &lt;div class="row-fluid&gt; 中允许多个组件。

但是,从组件模板级别,我似乎无法检索页面本身上实际存在的该模板组件的实际数量。我根据组件本身的架构选项计算所用组件的宽度。我使用以下 组件模板 代码来正确呈现它:

@{
var spanClass = String.Empty;
if (Fields.HasField("component_width") && Fields.component_width != null) {
    if (Fields.component_width.ToLower() == "full") {
        spanClass = "span12";
    } else if (Fields.component_width.ToLower() == "half") {
        spanClass = "span6";
    } else if (Fields.component_width == "40%") {
        spanClass = "span5";
    } else if (Fields.component_width == "35%") {
        spanClass = "span4";
    } else if (Fields.component_width == "25%") {
        spanClass = "span3";
    }
}
}
<div class="@spanClass">...code

回答我的问题:如果已达到数字 12,我需要能够关闭 &lt;row-fluid&gt; div。因此,如果选择了一个带有“Full”(宽度)选项的组件,则需要出现以下输出代码:

<div class="row-fluid">
    <div class="span12">..code</div>
</div>

如果页面上有两个组件选择了“半”选项,则必须允许

<div class="row-fluid">
    <div class="span6">..code</div>
    <div class="span6">..code</div>
</div>

注意最后的结束 div。有什么方法可以从页面模板访问我在组件模板var spanClass = String.Empty; 上创建的变量?比如:

@foreach (var cp in GetComponentPresentationsByTemplate("XM_Generic Content")) {
            @if (cp.Component.spanClass == "span6") {
                <div class="row-fluid">
                @cp.RenderComponentPresentation()
                @if (cp.Index == 1) {
                   </div>
                }
            }
}

我仍在了解 Razor 模板、响应式设计的实用性,当然还有 StackOverflow。很有可能我完全错过了一些东西,在我的代码中犯了愚蠢的错误,只是问了一个愚蠢的问题。无论如何,请告诉我。

【问题讨论】:

  • Nuno 的答案听起来坚如磐石,但我相信 Priyank 可能对帮助文件有所了解。毕竟,我决定使用带有可嵌入架构的架构来解决此问题,并使用不同的专用模板。感谢您的帮助。
  • 问得好,我们是否有兴趣提交Area 51 Tridion specific proposal。如果有时间,请使用同一个 SO 帐户注册。
  • 很好奇。我以为我已经承诺了,大约 4 个月前。我现在用这个帐户这样做了。

标签: razor tridion experience-manager


【解决方案1】:

包不在模板运行时之间共享,所以这种行为是正常的(无法从不同的实例看到在一个模板中设置的变量)。

有很多方法可以解决这个问题,但您应该考虑一下,也许 Tridion 选择隔离模板执行是有充分理由的。

请参阅here 了解解决此问题的方法之一。

【讨论】:

    【解决方案2】:

    使用 ContextVariables 字典的标准技术不允许您在 CT 中设置某些内容并从 PT 访问它。实际上,每次渲染组件时,渲染上下文都会从页面渲染上下文中获取变量的新副本。回信给他们,因此无效。有一种技术可以解决这个问题,即described in detail on tridion-practice。如前所述,诉诸这些技术不应该是您的首选,但有时您需要这样做。

    【讨论】:

      【解决方案3】:

      目前,用户似乎正在定义组件字段中的宽度位置。我认为,它很典型,但是如果您创建 5 个将调用相同 Razor TBB 的组件模板,并在组件模板上定义一个参数模式,可以在其中设置组件的宽度,那么之后您可以轻松地在页面模板。

      【讨论】:

      • 我不太确定我是否在关注,因为我可以从页面模板调用组件模板就好了,但不是我在组件模板本身中设置的变量。
      • 嗯,那么在这种情况下,只需在 Helper 文件中定义一个函数并在页面模板上调用该函数。我认为,这只是将这个函数作为变量调用的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2012-09-29
      • 2016-03-10
      • 2012-05-19
      • 1970-01-01
      • 2012-06-07
      • 2015-11-08
      相关资源
      最近更新 更多