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

时间:2018-07-10 23:28:44

标签: kentico

我有一个自定义模块,该模块使用Kentico API(DocumentHelper)更新我的文档的某些字段,然后发布,但我不希望它触发链接到我的文档页面类型的事件处理程序。我尝试向.Publish(“ admin_edit”)添加注释,希望可以从WorkflowEventargs参数中捕获它,但是VersionComment属性始终返回null。在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;
    }

1 个答案:

答案 0 :(得分:0)

对于版本信息,您总是会得到null,因为这与“ 页面版本控制”事件有关,特别是对于“ SaveVersion ”事件。您可以在此link上找到有关此内容的更多信息。如果展开“属性”,则将看到为特定事件填充了哪些属性。对于您的情况,您可以尝试类似的操作,添加消息的最新版本,然后在“ 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 进行了测试。