我可以在 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 中提到的那样使用 RequestStockHelper 或 Recursion Control。我个人更喜欢使用 RequestStockHelper,它的工作方式类似于请求上下文。
您可以尝试 DocumentEvents.Update.Continue = false。有一个old topic on that
我们正在使用的 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 中提到的那样使用 RequestStockHelper 或 Recursion Control。我个人更喜欢使用 RequestStockHelper,它的工作方式类似于请求上下文。
您可以尝试 DocumentEvents.Update.Continue = false。有一个old topic on that