Razor:从页面模板上的组件模板中检索变量

时间:2012-12-07 11:10:55

标签: razor tridion experience-manager


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

通过使用类引入动态计算的div宽度,twitter bootstrap允许出色的responsive design。例如,<div class="span12>使用包装器的整个宽度。 A&#34; span6&#34;有效地使用一半,并计算一定的余量以允许另一个div与&#34; span6&#34;。但是,这仅在前面的类被调用<div class="row-fluid">时才有效,并且只要跨度<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>

使用组件模板呈现<div class="span[#]">,以便允许<div class="row-fluid>中的多个组件,页面模板呈现

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

@{
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,我需要能够关闭<row-fluid> div。因此,如果一个组件具有选项&#39; Full&#39;选择(宽度),需要显示以下输出代码:

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

如果页面上有两个组件,选项&#34; half&#34;被选中,必须允许

<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的实用性。有可能我完全错过了一些东西,在我的代码中犯了一个愚蠢的错误,只是问了一个愚蠢的问题。请务必告诉我。

3 个答案:

答案 0 :(得分:6)

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

有很多方法可以解决这个问题,但你应该考虑一下Tridion选择隔离模板执行的原因。

有关解决此问题的方法之一,请参阅here

答案 1 :(得分:3)

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

答案 2 :(得分:2)

目前看来,用户正在组件字段中定义宽度位置。我认为,它很典型,但如果你创建了5个组件模板,它将调用相同的Razor TBB,并且还定义了组件模板上的参数模式,其中可以设置组件的宽度,然后您可以轻松调用这些不同的CT页面模板。