当前位置: 首页 > 知识库问答 >
问题:

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

熊哲圣
2023-03-14

我有一个自定义模块,它使用Kentico API(DocumentHelper)更新文档的某些字段,然后发布,但我不希望它触发链接到文档页面类型的事件处理程序。我试着给它添加评论。Publish(“admin_edit”)希望我可以从WorkflowEventargs参数捕捉到它,但VersionComment属性总是返回null。肯蒂科有没有办法做到这一点?

更新字段:

    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个答案

虞华翰
2023-03-14

版本信息总是为null,因为这与“页面版本控制”事件有关,特别是“保存版本”。你可以在这个链接上找到更多信息。如果展开“属性”,您将看到为特定事件填充了哪些属性。在您的情况下,您可以尝试这样的操作,为最新版本添加消息,然后在“发布后”事件中查看该评论,请参阅下面的代码:

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测试的。

 类似资料:
  • 问题内容: 我正在尝试做类似于嵌入式Google地图的操作。我的组件应忽略单点触摸(允许用户滚动页面),并在其自身外部捏合(允许用户缩放页面),但应对双键触摸做出反应(允许用户在组件内部导航),并在这种情况下禁止任何默认操作。 如何防止触摸事件的默认处理,仅在用户用两只手指与我的组件进行交互的情况下? 我尝试过的 我尝试捕获,和。事实证明,在FF Android上,对部件进行捏合时触发的第一个事件

  • 我需要从OracleIdtyManager中的自定义后处理事件处理程序调用外部REST API? 如果有人有想法,请在这里发布。

  • 当我在1到9之间选择一个数字并在控制台中输入一个数字时,该方法会工作并进行正确的移动。但我的问题是如何避免当我输入一个字母而不是一个数字时,程序就崩溃了。

  • 问题内容: 假设我定义了一些全局Ajax事件处理程序(ajaxStart,ajaxStop和ajaxError)。通常,我对此表示满意,但对于一个请求,我想禁用ajaxError处理程序,但仍照常运行ajaxStart和ajaxStop处理程序。在jQuery的AJAX功能的文件中提到,可以设置为false,并传递到$就功能禁用所有全局AJAX事件处理程序的“全球性”的参数,但他们没有提及任何办法

  • 问题内容: 如何防止onclick方法中的默认设置?我有一个传递自定义值的方法 问题答案: 让您的回调返回并将其传递给处理程序: 但是,要创建可 维护的 代码,您应该避免使用_“内联Javascript”_(即直接位于元素标签内的代码),并通过包含的Javascript源文件(称为unobtrusiveJavascript)修改元素的行为。 标记: 代码(单独的文件):

  • 问题内容: 我有一棵divs树: 在div上单击时,将使其子级不可见-即单击“ a”将使“ b”和“ c”不可见。 问题是:单击“ b”将调用“ a”的单击,并使“ b”和“ c”不可见。如何使用jQuery禁用对“ a”的点击? 谢谢 问题答案: 您可以为孩子添加一个处理程序,以防止click事件蔓延: 这样一来,点击不会传播到。都不会单击以转到,因此也不会。