在从页面上的内容区域中删除一个块时触发事件(使用“内容区域”中的“删除”),并且当用户单击“移动到垃圾箱”时,

时间:2019-02-12 04:13:55

标签: episerver episerver-7 episerver-8 episerver-10

每当编辑器删除一个块(使用“内容区域”中的“删除”)以及用户在资产窗格中的某个块上单击“移动到垃圾箱”时,我都想触发一个事件。

我发现 DataFactory.Instance.MovedContent 事件,该事件在每次单击“移至垃圾箱”时都会触发

但是在“内容区域”上单击“删除”时,它不会触发。

更新:-

我正在执行这些步骤以实现点击删除

  1. 注册事件处理程序以保存页面事件和页面的已保存事件。

  2. 在保存事件中,获取正在保存的页面,并通过ContentArea.Items从内容区域获取块ID。使用contentlink.ID属性。

  3. 将这些ID存储在列表中,将其存储在内存中的某个位置,最好存储在httpcontext.items集合中,因为您只需要它用于请求,但短暂的缓存也可以。现在,您已经知道编辑器更改之前所有块的ID。

  4. 在已保存的事件中,获取新的ID列表,如上。现在,您知道编辑器更改后的ID。某些区块ID将丢失。通过您想做的任何事情来处理这些事情...

    void Instance_SavingContent(object sender, ContentEventArgs e)
    {
        if (e.Content is ListPdfDocumentBlock)
        {
            var properties = e.Content.GetType().GetProperties().Where(i => i.PropertyType == typeof(ContentArea));
            if (properties != null)
            {
                List<int> ids = new List<int>();
                foreach (var property in properties)
                {
                    ContentArea contentArea = property.GetValue(e.Content) as ContentArea;
                    if (contentArea != null)
                    {
                        foreach (ContentAreaItem contentAreaItem in contentArea.Items)
                        {
                            IContent itemContent = contentAreaItem.GetContent();
                            ids.Add(itemContent.ContentLink.ID);
                        }
                    }
                }
                HttpContext.Current.Items.Add("pdfId", ids);
            }
        }
    }
    

但是此代码的问题是,它总是返回更新的ID。那么我将如何从旧到新进行比较,以找出要删除的块。

1 个答案:

答案 0 :(得分:1)

从内容区域中删除内容时,项目引用只是从该内容区域中删除 。从内容区域中删除的实际内容(例如,块/媒体)实际上并没有被移动/删除(创建位置仍会存在,通常在某些资产文件夹中)。

因此,从内容区域中删除某些内容时,唯一发生的事情是更改了内容区域中包含的内容。删除的项目保持不变。

您可以挂起PublishingContent事件,将发布的内容与当前发布的版本(如果有)进行比较,并比较其内容区域中的项目,以查看是否添加或删除了任何内容。