c# - 在 SItecore 中首次保存后如何停止自定义 OnSaving 事件?

标签 c# sitecore

在将自定义 OnSaving 事件应用于保存链中的第一个项目后,我试图停止该事件。

但到目前为止我还无法做到这一点,并且最终出现了 stackoverflow 异常。

有没有简单的方法可以做到这一点?

最诚挚的问候,

罗宾

private void AddOrRemoveRedirectingItemIdFromSavingItemIdList(Item savingItem, SitecoreEventArgs sitecoreEventArgs)
{
    ItemLink[] referers = Globals.LinkDatabase.GetReferrers(savingItem);

    var guidList = new List<ID>();

    foreach (ItemLink link in referers)
    {
        // checking the database name of the linked Item
        if (!link.SourceDatabaseName.Equals(Context.ContentDatabase.Name, StringComparison.CurrentCultureIgnoreCase))
        {
            continue;
        }

        Item item = Context.ContentDatabase.Items[link.SourceItemID, savingItem.Language];

        // adding the Item to an array if the Item is not null
        if (item == null || item.Fields["301Redirect"] == null || item.Fields["301RedirectedTo"] == null)
        {
            continue;
        }

        // Update the saving item ids
        CheckboxField redirectField = item.Fields["301Redirect"];

        if (redirectField.Checked)
        {
            guidList.Add(item.ID);
        }
    }

    if (guidList.Any())
    {
        this.SaveIDsToEditingItem(savingItem, guidList, false);
    }
}

private void SaveIDsToEditingItem(Item editingItem, IEnumerable<ID> guidList, bool forceModified)
{
    Field redirectedToFromItemId = editingItem.Fields["301RedirectedToFromItemId"];

    using (new EditContext(editingItem))
    {
        // Saving the redirected items ids
        string redirectedToFromItemIdOld = redirectedToFromItemId.Value;
        string redirectedToFromItemIdNew = string.Join("\n", guidList.Select(guid => guid.ToString()));

        // if the values are not changed
        if (redirectedToFromItemIdNew.Equals(redirectedToFromItemIdOld))
        {
            return;
        }

        redirectedToFromItemId.Value = redirectedToFromItemIdNew;
        if (forceModified)
        {
            editingItem.RuntimeSettings.ForceModified = true;
        }

        }
    }
}

最佳答案

您可以通过两种方式做到这一点。更好的方法是从 SaveIDsToEditingItem 中删除 using (new EditingContext(editingItem) 部分。在 OnItemSaving 事件中,对 savingItem 将被保留。

或者,如果您需要出于某种原因使用编辑上下文,则需要在 SaveIDsToEditingItem 方法中使用 EventDisabler:

private void SaveIDsToEditingItem(Item editingItem, IEnumerable<ID> guidList, bool forceModified)
{
    Field redirectedToFromItemId = editingItem.Fields["301RedirectedToFromItemId"];

    using (new EventDisabler())
    {
        using (new EditContext(editingItem))
        {
            // Saving the redirected items ids
            string redirectedToFromItemIdOld = redirectedToFromItemId.Value;
            string redirectedToFromItemIdNew = string.Join("\n", guidList.Select(guid => guid.ToString()));

            // if the values are not changed
            if (redirectedToFromItemIdNew.Equals(redirectedToFromItemIdOld))
            {
                return;
            }

            redirectedToFromItemId.Value = redirectedToFromItemIdNew;
            if (forceModified)
            {
                editingItem.RuntimeSettings.ForceModified = true;
            }
        }
    }
}

这将防止再次触发 OnSaving 事件。

关于c# - 在 SItecore 中首次保存后如何停止自定义 OnSaving 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36007791/

相关文章:

c# - : "Client side asynchronous frameworks"是什么意思

c# - 在 web 服务的情况下如何从 WSDL 生成代理类

c# - 我如何在 VS2013 中找到本地人?

c# - EndRead引发IO异常

c# - 是否可以根据用户在 sitecore 中上传的图像创建 Sprite ?

c# - Sitecore:为什么我的管道查询只为我的 droptree 返回一组结果?

营销人员的 Sitecore WebForms : send email to users

c# - 枚举列表比 IList、ICollection 和 IEnumerable 更快

html - 如何在 sitecore 中存储菜单字体图标

Sitecore Item Web api 出现 404