C# 我可以在DocumentEvents.Update.Before事件中更改TreeNode中属性的值吗?
我们正在使用的树节点中的一个特定字段需要在其兄弟节点中是唯一的。为了确保它是唯一的,我尝试在用户更改并保存TreeNode时更改该字段的值。这会导致save事件再次激发,它调用我的事件处理程序,再次激发事件。这是一个不需要的循环 有没有办法在不触发更新事件的情况下更新treenode 我能想到的唯一方法是直接对数据库执行sql查询,但我希望有更好的方法 TreeNode.提交变更(错误);和TreeNode.Update();两者都触发DocumentEvents.Update事件,因此无法解决问题 从Kentico用户界面触发事件或从我的C#代码触发事件时,我看不到DocumentEventArgs之间有任何差异 事件处理程序调用:C# 我可以在DocumentEvents.Update.Before事件中更改TreeNode中属性的值吗?,c#,model-view-controller,kentico,C#,Model View Controller,Kentico,我们正在使用的树节点中的一个特定字段需要在其兄弟节点中是唯一的。为了确保它是唯一的,我尝试在用户更改并保存TreeNode时更改该字段的值。这会导致save事件再次激发,它调用我的事件处理程序,再次激发事件。这是一个不需要的循环 有没有办法在不触发更新事件的情况下更新treenode 我能想到的唯一方法是直接对数据库执行sql查询,但我希望有更好的方法 TreeNode.提交变更(错误);和TreeNode.Update();两者都触发DocumentEvents.Update事件,因此无法解决
DocumentEvents.Update.Before +=
uniquePageAliasModule.EnsureUniquePageAliasOnUpdate;
事件处理程序实现:
treeNode.SetValue((Metadata.MetadataPageUrlPath), path);
treeNode.SubmitChanges(false);
所需:保存对TreeNode的更改,并且不触发DocumentEvents.Update事件
实际:保存对树节点的更改并激发DocumentEvents。更新事件尝试以下操作:
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;
}
}
您可以像中提到的那样使用RequestStockHelper或递归控件。我个人更喜欢使用RequestStockHelper,它的工作原理类似于请求上下文
您可以尝试DocumentEvents.Update.Continue=false。有一个是我最初作为代码使用的,但这会导致循环。我发现了一些似乎有效的方法,我将添加它作为答案。不确定是否有副作用。我发现这种方法有两个副作用。这不会在Kentico用户界面中显示更新的值,即使它在数据库中已更新。它也可能不是线程安全的,因为它更改了Kentico中更多位置使用的全局变量。我的同事也发现了这一点,我正要发布这一点,但我要将您的答案标记为解决方案:)