Sitecore的编程方式添加布局。值不能不能为空。的参数名称路径 [英] Sitecore programmatically add layout. Value cannot not be null. Parameter name Path
问题描述
在我的previous的问题,我想出如何在Sitecore的编程方式添加一个布局,在布局和sublayouts相同的标准值能正常工作。但是,当这个不同,我得到一个值不能不能为空。参数名称路径错误。
我编程方式添加一个布局,因为该要求时,复选框被选中添加一个移动的布局。并删除当复选框未选中布局。
我在互联网上搜索并添加<一个href=\"http://sdn.sitecore.net/Products/Sitecore%20V5/Sitecore%20CMS%206/ReleaseNotes/KnownIssues%20Recommended/Incorrect%20Renderings%20field%20value%20may%20cause%20errors.aspx\"相对=nofollow>从Sitecore的解决为__Renderings领域,但<一href=\"http://sdn.sitecore.net/Products/Sitecore%20V5/Sitecore%20CMS%206/ReleaseNotes/KnownIssues%20Recommended/Incorrect%20Renderings%20field%20value%20may%20cause%20errors.aspx\"相对=nofollow>这个不解决问题。
在code以添加一个布局+ sublayout:
保护无效AddMobileLayout(项目项)
{
使用(新SecurityDisabler())
{
LayoutDefinition layoutDefinition = Sitecore.Layouts.LayoutDefinition.Parse(项目[Sitecore.FieldIDs.LayoutField]);
DeviceDefinition mobileDevice = layoutDefinition.GetDevice(Resources.mobileDeviceID);
TemplateItem的ItemTemplate = item.Template; 如果(ItemTemplate中!= NULL)
{
如果(itemTemplate.StandardValues!= NULL)
{
项目standardValues = itemTemplate.StandardValues; 的foreach(DeviceItem deviceItem在Sitecore.Configuration.Factory.GetDatabase(主)。Resources.Devices.GetAll())
{
如果(deviceItem.ID.ToString()== Resources.mobileDeviceID)
{
mobileDevice.Layout = standardValues.Visualization.GetLayout(deviceItem).ID.ToString();
RenderingReference [] = sublayouts standardValues.Visualization.GetRenderings(deviceItem,真); 的foreach(在sublayouts RenderingReference sublayout)
{
RenderingDefinition渲染=新RenderingDefinition();
rendering.Placeholder = sublayout.Placeholder;
rendering.ItemID = sublayout.RenderingItem.ID.ToString(); mobileDevice.AddRendering(渲染);
}
}
}
}
}
item.Editing.BeginEdit();
尝试
{
item.Fields [Sitecore.FieldIDs.LayoutField] .value的= layoutDefinition.ToXml();
item.Editing.EndEdit(假);
}
赶上(System.Exception的前)
{
Sitecore.Diagnostics.Log.Error(无法更新项目+ item.Paths.FullPath +:+ ex.Message,这一点);
item.Editing.CancelEdit();
}
}
}
在code删除布局+ sublayouts:
保护无效RemoveMobileLayout(项目项)
{
使用(新SecurityDisabler())
{
LayoutDefinition layoutDefinition = Sitecore.Layouts.LayoutDefinition.Parse(项目[Sitecore.FieldIDs.LayoutField]);
DeviceDefinition mobileDevice = layoutDefinition.GetDevice(Resources.mobileDeviceID); 如果(mobileDevice.Layout!= NULL)mobileDevice.Layout = NULL;
如果(!mobileDevice.Renderings = NULL)mobileDevice.Renderings =新System.Collections.ArrayList(); item.Editing.BeginEdit();
尝试
{
item.Fields [Sitecore.FieldIDs.LayoutField] .value的= layoutDefinition.ToXml();
item.Editing.EndEdit(假);
}
赶上(System.Exception的前)
{
Sitecore.Diagnostics.Log.Error(无法更新项目+ item.Paths.FullPath +:+ ex.Message,这一点);
item.Editing.CancelEdit();
}
}
}
有没有人有任何建议/应答(S)?我使用Sitecore的6.4.1
在此先感谢
一个同事(谁是Sitecore的认证开发者)有送票Sitecore的......他们发送下面的回答:
尝试使用以下code:
<$p$p><$c$c>Sitecore.Layouts.LayoutDefinition.Parse(LayoutField.GetFieldValue(item.Fields[Sitecore.FieldIDs.LayoutField]))而不是:
Sitecore.Layouts.LayoutDefinition.Parse(项目[Sitecore.FieldIDs.LayoutField]);
In my previous question I figured out how to add a layout programmatically in Sitecore, this works fine when the layouts and sublayouts are the same as the Standard Values. But when this is different I get a Value cannot not be null. Parameter name Path error.
I am adding a layout programatically because the requirements are to add a mobile layout when a checkbox is checked. And remove to layout when the checkbox is not checked.
I've searched on the internet and added the fix from Sitecore for the __Renderings field, but this doesn't solve the problem.
The code to add a Layout + sublayout:
protected void AddMobileLayout(Item item)
{
using (new SecurityDisabler())
{
LayoutDefinition layoutDefinition = Sitecore.Layouts.LayoutDefinition.Parse(item[Sitecore.FieldIDs.LayoutField]);
DeviceDefinition mobileDevice = layoutDefinition.GetDevice(Resources.mobileDeviceID);
TemplateItem itemTemplate = item.Template;
if (itemTemplate != null)
{
if (itemTemplate.StandardValues != null)
{
Item standardValues = itemTemplate.StandardValues;
foreach (DeviceItem deviceItem in Sitecore.Configuration.Factory.GetDatabase("master").Resources.Devices.GetAll())
{
if (deviceItem.ID.ToString() == Resources.mobileDeviceID)
{
mobileDevice.Layout = standardValues.Visualization.GetLayout(deviceItem).ID.ToString();
RenderingReference[] sublayouts = standardValues.Visualization.GetRenderings(deviceItem, true);
foreach (RenderingReference sublayout in sublayouts)
{
RenderingDefinition rendering = new RenderingDefinition();
rendering.Placeholder = sublayout.Placeholder;
rendering.ItemID = sublayout.RenderingItem.ID.ToString();
mobileDevice.AddRendering(rendering);
}
}
}
}
}
item.Editing.BeginEdit();
try
{
item.Fields[Sitecore.FieldIDs.LayoutField].Value = layoutDefinition.ToXml();
item.Editing.EndEdit(false);
}
catch (System.Exception ex)
{
Sitecore.Diagnostics.Log.Error("Could not update item " + item.Paths.FullPath + ": " + ex.Message, this);
item.Editing.CancelEdit();
}
}
}
The code to remove the layout + sublayouts:
protected void RemoveMobileLayout(Item item)
{
using (new SecurityDisabler())
{
LayoutDefinition layoutDefinition = Sitecore.Layouts.LayoutDefinition.Parse(item[Sitecore.FieldIDs.LayoutField]);
DeviceDefinition mobileDevice = layoutDefinition.GetDevice(Resources.mobileDeviceID);
if (mobileDevice.Layout != null) mobileDevice.Layout = null;
if (mobileDevice.Renderings != null) mobileDevice.Renderings = new System.Collections.ArrayList();
item.Editing.BeginEdit();
try
{
item.Fields[Sitecore.FieldIDs.LayoutField].Value = layoutDefinition.ToXml();
item.Editing.EndEdit(false);
}
catch (System.Exception ex)
{
Sitecore.Diagnostics.Log.Error("Could not update item " + item.Paths.FullPath + ": " + ex.Message, this);
item.Editing.CancelEdit();
}
}
}
Does anyone have any suggestions/answer(s)? I am using sitecore 6.4.1
Thanks in advance
A colleague (who is a Sitecore certified developer) has send a ticket to Sitecore... They send the following answer:
Try to use the following code:
Sitecore.Layouts.LayoutDefinition.Parse(LayoutField.GetFieldValue(item.Fields[Sitecore.FieldIDs.LayoutField]))
instead of:
Sitecore.Layouts.LayoutDefinition.Parse(item[Sitecore.FieldIDs.LayoutField]);
这篇关于Sitecore的编程方式添加布局。值不能不能为空。的参数名称路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!