簡體   English   中英

Razor:從頁面模板上的組件模板中檢索變量

[英]Razor: Retrieving variable from component template on page template


大家好,我一直在研究一套Razor模板,這些模板既可以使用體驗管理器進行站點編輯,也可以使用Twitter引導程序完全響應多個屏幕寬度。 因此,我需要根據Experience Manager編輯器添加或刪除的內容動態操作DOM輸出,但仍然保持響應式設計。 這種結構的一部分是遵守twitter bootstrap規定的規則。

twitter引導程序通過使用類引入動態計算的div寬度,可實現出色的響應式設計 例如, <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>

<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。 因此,如果選擇了一個具有“完整”(寬度)選項的組件,則需要顯示以下輸出代碼:

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

如果頁面上有兩個組件,並且選擇了“half”選項,則必須允許

<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的實用性。 有可能我完全錯過了一些東西,在我的代碼中犯了一個愚蠢的錯誤,只是問了一個愚蠢的問題。 無論如何,請告訴我。

模板運行時之間不共享包,因此這種行為是正常的(無法查看來自不同實例的一個模板中設置的變量)。

有很多方法可以解決這個問題,但你應該考慮一下Tridion選擇隔離模板執行的原因。

請參閱此處了解解決此問題的方法之一。

使用ContextVariables字典的標准技術不允許您在CT中設置某些內容並從PT訪問它。 實際上,每次渲染Component時,渲染上下文都會從頁面渲染上下文中獲取變量的新副本。 因此,回寫它們是無效的。 有一種技術可以解決這個問題, 詳細描述了tridion-practice 如前所述,采用這些技術不應該是你的第一選擇,但有時你需要。

目前,似乎用戶正在組件字段中定義寬度位置。 我認為,它很典型,但如果你創建了5個組件模板,它將調用相同的Razor TBB,並且還定義了組件模板上的參數模式,其中可以設置組件的寬度,然后您可以輕松調用這些不同的CT頁面模板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM