2015-11-18 87 views
3

在Sitecore 8.0项目上我目前正在尝试以编程方式更新RenderingReference的数据源。 由于之前的决定,渲染的数据源不是基于Id,而是基于路径。Sitecore更新渲染引用

使用以下代码获取渲染引用,并在方法内正确更新数据源。但这些更改从未保存到数据库中。

有什么我做错了吗?还是我想做一些不可能的事情?

page.Editing.BeginEdit(); 
var renderings = page.Visualization.GetRenderings(Sitecore.Context.Device, true); 
foreach (var rendering in renderings) 
{ 
    rendering.Settings.DataSource = "A New DataSource"; 
} 
page.Editing.EndEdit(); 

回答

3

您需要更新__Layout字段的值。

有一个很好的博客文章解释这里:Update data source of sublayout or rendering in Sitecore

的代码是这样说:

public void UpdateRenderingDatasource(Item item, string newDatasource) 
{ 
    //Get all added renderings 
    Sitecore.Layouts.RenderingReference[] renderings = item.Visualization.GetRenderings(Sitecore.Context.Device, true); 

    // Get the layout definitions and the device 
    LayoutField layoutField = new LayoutField(item.Fields[Sitecore.FieldIDs.LayoutField]); 
    LayoutDefinition layoutDefinition = LayoutDefinition.Parse(layoutField.Value); 
    DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(Sitecore.Context.Device.ID.ToString()); 
    foreach (RenderingReference rendering in renderings) 
    { 
     // Update the renderings datasource value accordingly 
     deviceDefinition.GetRendering(rendering.RenderingID.ToString()).Datasource = newDatasource; 
     // Save the layout changes 
     item.Editing.BeginEdit(); 
     layoutField.Value = layoutDefinition.ToXml(); 
     item.Editing.EndEdit(); 
    } 
} 
+1

非常感谢您的回答。我结束了包含0渲染的DeviceDefinition。这似乎是由于Sitecore 8.0具有共享布局和最终布局。通过将新的LayoutField的参数更改为[Sitecore.FieldIds.FinalLayoutField],我得到了正确的效果图。 – Thomas

+0

完美!很高兴帮助你。 –