c# - Sitecore 以编程方式访问布局定义

标签 c# sitecore sitecore7.5

我想访问一个项目的布局定义,以便我可以访问添加到该项目的渲染,然后访问附加到所述渲染的数据源。我似乎找不到办法做到这一点。我能做的最好的事情就是访问 __renderings 字段,但我随后发现这将访问原始渲染定义项,而不是存储在设计布局中的特定数据源实例。

这是在 Sitecore 7.5 MVC 上

如果有帮助,这就是我尝试做的:

// Get the default device
DeviceRecords devices = item.Database.Resources.Devices;
DeviceItem defaultDevice = devices.GetAll().Where(d => d.Name.ToLower() == "default").First();

// Get the rendering references for the default device
Sitecore.Data.Fields.LayoutField layoutField = item.Fields["__renderings"];
Sitecore.Layouts.RenderingReference[] renderings = layoutField.GetReferences(defaultDevice);

// Get the required renderings
RenderingItem headerRenderingItem = null;
RenderingItem aboutRenderingItem = null;

foreach (var rendering in renderings)
{
    if (rendering.Placeholder == "headerPlaceholder")
        headerRenderingItem = rendering.RenderingItem;
    else if (rendering.Placeholder == "/aboutSectionPlaceholder/textPlaceholder")
        aboutRenderingItem = rendering.RenderingItem;
}
Assert.IsNotNull(headerRenderingItem, "no header rendering item found");
        Assert.IsNotNull(aboutRenderingItem, "no about rendering item found");

// Get their datasources
ID headerDatasourceId = ID.Parse(headerRenderingItem.DataSource); // The datasource string is null as it is accessing the datasource definition item itself
ID aboutDatasourceId  = ID.Parse(aboutRenderingItem.DataSource);  // Same as above

最佳答案

RenderingReference.RenderingItem 引用/layout 部分中的呈现项。您可以做的是使用 RenderingReference.Settings.Datasource

所以你的代码看起来像这样:

foreach (var rendering in renderings)
{
    if (rendering.Placeholder == "headerPlaceholder")
        headerRenderingDatasourceId = rendering.Settings.Datasource;
    else if (rendering.Placeholder == "/aboutSectionPlaceholder/textPlaceholder")
        aboutRenderingDatasourceId = rendering.Settings.Datasource;
}

Item headerRenderingDatasourceItem;
if (!string.IsNullOrEmpty(headerRenderingDatasourceId)
    headerRenderingDatasourceItem = item.Database.GetItem(headerRenderingDatasourceId);

关于c# - Sitecore 以编程方式访问布局定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34539521/

相关文章:

使用 Lucene 搜索时 Sitecore 返回 "Popular searches"?

尝试定义 WFFM(营销人员 Web 表单)受限占位符时 Sitecore 卡住

c# - 无法从 docker 容器连接到 SQL Server

c# - 如何检查元素是否存在?

c# - 在覆盆子上全屏启动单声道应用程序

asp.net-mvc - Sitecore PageEditor 随机显示 Glass.Mapper 错误

c# - 在运行时使用 jQuery 将 JavaScript 注入(inject) WebBrowser

c# - 避免在重建期间删除当前的 Lucene.NET 索引

sitecore - Sitecore 7.5 的 MVC 检测和 WebApi 属性路由