如何防止全局事件处理程序因 API 调用而触发

How to prevent global event handlers from firing caused by an API call

我有一个自定义模块,它使用 Kentico API (DocumentHelper) 更新文档的某些字段然后发布,但我不希望它触发链接到我的文档页面类型的事件处理程序.我尝试向 .Publish("admin_edit") 添加注释,希望我可以从 WorkflowEventargs 参数中捕获它,但 VersionComment 属性 始终 return 为空。有没有办法在 Kentico 中完成此操作?

更新字段:

    var document = DocumentHelper.GetDocument(documentID, tree);
    var workflowManager = WorkflowManager.GetInstance(tree);
    var workflow = workflowManager.GetNodeWorkflow(document);
    if (workflow != null)
    {
        document.CheckOut();
        document.SetValue("SomeFIeld", "some value");
        document.Update(true);
        document.CheckIn();
        document.Publish("admin_edit");            
    }

事件处理程序:

    public override void Init()
    {
        WorkflowEvents.Publish.After += Publish_After;
    }

    private void Publish_After(object sender, WorkflowEventArgs e)
    {
        if (!string.IsNullOrEmpty(e.VersionComment) &&
            e.VersionComment.Contains("admin_edit"))
            return;
    }

版本信息总是为空,因为这与“页面版本控制”事件有关,特别是“SaveVersion” .您可以在 link 上找到更多相关信息。如果展开 'Properties',您将看到为特定事件填充了哪些属性。在你的情况下,你可以尝试这样的事情,为上一个版本添加你的消息,然后检查关于'Publish_After'事件的评论,见下面的代码:

var document = DocumentHelper.GetDocument(documentID, tree);
var workflowManager = WorkflowManager.GetInstance(tree);
var workflow = workflowManager.GetNodeWorkflow(document);
if (workflow != null)
{
    document.CheckOut();
    document.SetValue("SomeFIeld", "some value");
    document.Update(true);
    document.CheckIn(versionComment: "admin_edit");
    document.Publish();            
}

然后,在事件处理程序中,获取最新版本并检查评论,如下所示:

    if (e.PublishedDocument?.VersionHistory?.Count > 0)
    {
        var lastVersion = e.PublishedDocument.VersionHistory[0] as VersionHistoryInfo;
        if (lastVersion.VersionComment.Equals("admin_edit"))
        {
            return;
        }
    }

注意: 如果您有很多并发内容编辑器,您的最后一个版本可能不是来自 API 的版本(有人更改了内容并在您的 API 调用进行更改后立即保存)。这种可能性很小,但仍然有可能。如果这是您经常使用的东西,则必须考虑到它。此代码已针对 Kentico 11.

进行测试