如何在Rest API中编程获取Sitecore条目的Presentation Details
问题根因
非Sitecore前端页面请求的场景(Rest API、索引写入任务等)不会自动初始化
Sitecore.Context上下文相关属性,Sitecore.Context.Device为空属于预期行为。
解决方案
方案1:主动获取指定Device实例调用GetLayout
无需依赖上下文的Device对象,直接从Sitecore数据库读取你业务需要的Device实例即可,示例代码如下:
// 根据业务场景选择读取master或web数据库 var database = Sitecore.Configuration.Factory.GetDatabase("web"); // 示例为获取默认Device,也可根据指定DeviceID/名称查询匹配的Device var targetDevice = database.Resources.Devices.GetAll().FirstOrDefault(d => d.Name == "Default"); if (targetDevice != null) { LayoutItem layoutItem = item.Visualization.GetLayout(targetDevice); // 此处添加后续处理Layout的业务逻辑 }
如果你的Rest API需要支持多设备的Presentation查询,可将Device标识作为接口请求参数传入,根据参数动态查询对应的Device实例即可。
方案2:直接解析Presentation原始字段值(无上下文依赖)
该方案更适合索引写入场景,不需要依赖任何Sitecore上下文,直接读取条目自带的展示详情字段解析即可,示例代码如下:
// 读取系统内置__Renderings字段的原始值,包含该条目所有设备的展示配置 string renderingRawXml = item[Sitecore.FieldIDs.LayoutField]; // 用Sitecore自带的LayoutDefinition工具类直接解析 LayoutDefinition layoutDefinition = LayoutDefinition.Parse(renderingRawXml); // 如需获取指定设备的配置,传入对应Device的ID即可 DeviceDefinition deviceConfig = layoutDefinition.GetDevice(targetDeviceId);
场景适配建议
- 索引写入环节优先使用方案2,完全无上下文依赖,解析效率更高
- Rest API场景如果只需要适配单设备,两种方案均可,多设备适配建议结合请求参数使用方案1
内容的提问来源于stack exchange,提问作者Anthony Fernandes
相关产品推荐
相关产品推荐

