我可以在 DocumentEvents.Update.Before 事件中更改 TreeNode 中 属性 的值吗?

Can I change a value of a property in a TreeNode in a DocumentEvents.Update.Before event?

我们正在使用的 TreeNodes 中的特定字段需要在其兄弟节点中是唯一的。为了确保它是唯一的,我试图在用户更改并保存时更改 TreeNode 中字段的值。这导致保存事件再次触发,调用我的事件处理程序,再次触发事件。这是一个不需要的循环。

有没有办法在不触发更新事件的情况下更新树节点?

我能想到的唯一方法是直接对数据库执行 sql 查询,但我希望有更好的方法。

TreeNode.SubmitChanges(假);和 TreeNode.Update();两者都触发了 DocumentEvents.Update 事件,因此并没有解决问题。

当事件从 Kentico 用户界面触发或从我的 C# 代码触发时,DocumentEventArgs 之间没有任何区别。

事件处理程序调用:

DocumentEvents.Update.Before += 
uniquePageAliasModule.EnsureUniquePageAliasOnUpdate;

事件处理程序实现:

treeNode.SetValue((Metadata.MetadataPageUrlPath), path);
treeNode.SubmitChanges(false);

期望:保存对 TreeNode 的更改并且不触发 DocumentEvents.Update 事件

实际:保存对 TreeNode 的更改并触发 DocumentEvents.Update 事件

尝试这样的事情:

TreeNode treeNode = e.Node;
treeNode.SetValue((Metadata.MetadataPageUrlPath), path);
treeNode.Update();

Kentico 应该自行防止事件循环。

您可以暂时抑制 DocumentEvents.Update 事件。

DocumentEvents.Update.Allow = false;
treeNode.Update();
DocumentEvents.Update.Allow = true;

或作为方法:

public void Save(BaseInfo baseInfo, bool doFireSaveEvent)
{
    var allowsUpdateEvents = DocumentEvents.Update.Allow;

    DocumentEvents.Update.Allow = doFireSaveEvent;
    try
    {
        baseInfo.Update();
    }
    catch (Exception e)
    {
        EventLogProvider.LogEvent(
            "E",
            $"{nameof(TreeNodeRepository)}.{ nameof(TreeNodeRepository.Save)}",
            "TREENODE_CAN_NOT_BE_SAVED",
            e.Message);
    }
    finally
    {
        DocumentEvents.Update.Allow = allowsUpdateEvents;
    }
}

您可以像 this article 中提到的那样使用 RequestStockHelperRecursion Control。我个人更喜欢使用 RequestStockHelper,它的工作方式类似于请求上下文。

您可以尝试 DocumentEvents.Update.Continue = false。有一个old topic on that