2016-04-16 21 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具有示例代码出现。