2016-04-16 23 views
1

我有一個頁面部分,當頁面添加到頁面時,它應該在ContentArea中呈現。這是完美的,但現在我在兩個不同的頁面上有兩個不同的ContentAreas,我希望添加相同的子頁面以在每個父頁面上呈現不同的頁面。在EpiServer中渲染不同的部分模板

我得到渲染局部的ContentAreas區分時,我可以以某種方式使用標籤:

@Html.PropertyFor(m => m.MyBlockProperty, new { Tag = RenderingTags.Sidebar }) 
@Html.PropertyFor(m => m.MyContentArea, new { Tag = RenderingTags.Sidebar }) 

但後來,在我的SomePage.cshtml(這是我的局部視圖),我做在這裏得到一個可變的東西或東西,所以我知道哪個標籤被要求?還是有一些像SidebarSomePage.cshtml這樣的命名約定,以便我可以定義多個部分模板?我必須創建一個控制器來處理這個問題嗎?這似乎是不必要的,我只是想根據頁面更改html一點...

回答

1

我敢肯定,您可以從視圖(或控制器)中的ViewData詞典中訪問標記,如下所示:

@ViewData["Tag"] 

您還可以通過任何其他設置到視圖

@Html.PropertyFor(m => m.MyContentArea, new { Tag = RenderingTags.Sidebar, RenderThisPartialDifferently = true, ShowHeading = false }) 

,然後訪問它們:

@ViewData["RenderThisPartialDifferently"] 
@ViewData["ShowHeading "] 

然後,您可以選擇在兩者之間放置控制器,並呈現完全不同的視圖。

很確定標記視圖也有一個命名約定。但我確實知道的是,您可以在/ shared/displaytemplates中放置一個與標記名稱相同的視圖。但這不是你現在要求的。

+0

我應該怎麼寫部分SidebarSomePage.cshtml訪問標籤? – theva

+0

謝謝!這工作完美!我正在使用@ - 這首先使我困惑了一下。 – theva

+0

我只是在你的問題中使用相同的語法。請改變你的問題,以反映你的剃刀語法:) –

1

創建一個PartialContentController<T>,然後使用TemplateDescriptorAttribute指定您不想使用的標籤。然後使用PropertyFor as Johan在視圖中解釋。

EPiServer documentation

您選擇渲染內容實例的模板取決於具體情況,如通道和標記。要使模板自動註冊,必須實現EPiServer.Web.IRenderTemplate(其中T表示可以呈現哪種模型)。如果您爲模板(如PageBase,ContentControlBase,BlockControlBase,PageController,PartialContentController或BlockController)使用基類,則不需要顯式實現接口,因爲這是由基類完成的。另外,您可以使用TemplateDescriptorAttribute來指定有關模板的更多詳細信息,如標記和繼承,稍後還會介紹有關該主題的更多信息。

0

除了所有答案,您還可以使用模板註冊器爲特定標籤註冊其他模板。

[ServiceConfiguration(typeof(IViewTemplateModelRegistrator))] 
public class TemplateCoordinator : IViewTemplateModelRegistrator 
{ 

    public void Register(TemplateModelCollection viewTemplateModelRegistrator) 
    { 
     viewTemplateModelRegistrator.Add(typeof(MyBlock), new TemplateModel 
     { 
      Tags = new[] { RenderingTags.Sidebar }, 
      AvailableWithoutTag = false, 
      Path = BlockPath("Some-Other-Template.cshtml") 
     }); 
    } 
} 

這將確保,如果塊渲染「內部」 RenderingTags.Sidebar通過Html.PropertyFor(...., new { tag = RenderingTags.Sidebar }))文件Some-Other-Template.cshtml上下文(例如將被使用。

AlloyTech具有示例代碼出現。