在EpiServer中渲染不同的部分模板
当页面添加到ContentArea中时,我有一个页面部分应该呈现。 这是完美的,但现在我在两个不同的页面上有两个不同的ContentAreas,我希望添加相同的子页面以在每个父页面上呈现不同的页面。
我知道我可以以某种方式在呈现局部图像时使用标记来区分ContentAreas:
@Html.PropertyFor(m => m.MyBlockProperty, new { Tag = RenderingTags.Sidebar })
@Html.PropertyFor(m => m.MyContentArea, new { Tag = RenderingTags.Sidebar })
但是,在我的SomePage.cshtml(这是我的部分视图)中,我是否在这里获得了一个变化或某种东西,所以我知道哪个Tag被要求? 还是有一些像SidebarSomePage.cshtml这样的命名约定,以便我可以定义多个部分模板? 我必须创建一个控制器来处理这个问题吗? 这似乎是不必要的,我只是想根据页面改变一下html ...
我敢肯定,你可以像这样访问视图(或控制器)中ViewData字典中的标签:
@ViewData["Tag"]
您还可以将任何其他设置传递给视图
@Html.PropertyFor(m => m.MyContentArea, new { Tag = RenderingTags.Sidebar, RenderThisPartialDifferently = true, ShowHeading = false })
然后访问它们:
@ViewData["RenderThisPartialDifferently"]
@ViewData["ShowHeading "]
然后你可以选择在两者之间放置一个控制器,并呈现完全不同的视图。
很确定,标签视图也有一个命名约定。 但我确实知道的是,您可以在/ shared / displaytemplates中放置一个与标记名称相同的视图。 但这不是你现在要求的。
创建一个PartialContentController<T>
,然后使用TemplateDescriptorAttribute
指定您不想使用的标签。 然后使用PropertyFor as Johan在视图中解释。
从EPiServer文档
您选择呈现内容实例的模板取决于特定的上下文,如频道和标记。 要使模板自动注册,必须实现EPiServer.Web.IRenderTemplate(其中T表示可以呈现哪种模型)。 如果您为模板(如PageBase,ContentControlBase,BlockControlBase,PageController,PartialContentController或BlockController)使用基类,则不需要显式实现接口,因为这是由基类完成的。 另外,您可以使用TemplateDescriptorAttribute来指定有关模板的更多详细信息,如标记和继承,稍后还会介绍有关该主题的更多信息。
除了所有答案外,您还可以使用模板注册器为特定标签注册其他模板。
[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在那里有示例代码。
链接地址: http://www.djcxy.com/p/68877.html