Sitecore的编程方式添加布局。值不能不能为空。的参数名称路径 [英] Sitecore programmatically add layout. Value cannot not be null. Parameter name Path

查看:113
本文介绍了Sitecore的编程方式添加布局。值不能不能为空。的参数名称路径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆