在EpiServer中渲染不同的部分模板

时间:2016-04-16 10:09:32

标签: razor episerver

我有一个页面部分,当页面添加到ContentArea时,它应该在ContentArea中呈现。这很好用,但现在我在两个不同的页面上有两个不同的ContentAreas,我希望在每个父页面上添加相同的子页面以使它们呈现不同。

我得到的是,在渲染局部区域时,我可以某种方式使用Tag来区分ContentAreas:

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

但是,在我的SomePage.cshtml(这是我的部分视图)中,我是否在这里获得了变量或其他内容,因此我知道要求哪个标签?或者是否有一些像SidebarSomePage.cshtml这样的命名约定,以便我可以定义多个部分模板?我是否必须创建一个控制器来处理这个问题?这对我来说似乎是不必要的,我只是想根据页面改变html ...

3 个答案:

答案 0 :(得分:1)

我非常确定您可以在视图(或控制器)中的ViewData字典中访问标记,如下所示:

@ViewData["Tag"]

您还可以将任何其他设置传递给视图

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

然后访问它们:

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

然后你可以选择在两者之间设置一个控制器并呈现一个完全不同的视图。

非常确定标签视图的命名约定也是如此。但我确实知道的是,您可以在/ shared / displaytemplates中放置与标记同名的视图。但那不是你现在要求的。

答案 1 :(得分:1)

创建PartialContentController<T>,然后使用TemplateDescriptorAttribute指定您不想使用的标记。然后使用PropertyFor作为Johan在视图中解释。

来自EPiServer documentation

  

您选择呈现内容实例的模板取决于特定的上下文,例如频道和标记。对于要自动注册的模板,它必须实现EPiServer.Web.IRenderTemplate(其中T表示它可以呈现的模型)。如果您为模板使用基类,如PageBase,ContentControlBase,BlockControlBase,PageController,PartialContentController或BlockController,那么您不需要显式实现接口,因为这是由基类完成的。此外,您可以使用TemplateDescriptorAttribute指定有关模板的更多详细信息,例如标记和继承,稍后将详细介绍该主题。

答案 2 :(得分: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")
        });
    }
}

这将确保if块被渲染&#34;内部&#34; RenderingTags.Sidebar文件Html.PropertyFor(...., new { tag = RenderingTags.Sidebar }))将被使用。

AlloyTech在那里有示例代码。