SharePoint Workflow:如何更新项目而不再触发工作流程

时间:2010-03-17 23:04:57

标签: sharepoint workflow

我有一个 SharePoint工作流程,只要商品更改运行。工作流与外部REST服务通信。如果服务返回一个字符串,我想用该字符串更新其中一个字段值。不幸的是,一旦当前工作流终止,此更新将触发此项的工作流的另一个实例。 我最终得到一个无限循环!

如何防止这种情况发生? SPListItem具有Update(),UpdateOverwriteVersion()和SystemUpdate()方法,但它们似乎都不会阻止后续工作流被触发。

我可以检查项目的最后修改时间戳,并在最后一次更新发生在特定时间范围内时终止工作流程,但我正在寻找更强大的解决方案。

5 个答案:

答案 0 :(得分:18)

您可以使用一些扩展方法来静默更新项目。

public static class SPListItemExtensions
{
/// <summary>
/// Provides ability to update list item without firing event receiver.
/// </summary>
/// <param name="item"></param>
/// <param name="doNotFireEvents">Disables firing event receiver while updating item.</param>
public static void Update(this SPListItem item, bool doNotFireEvents)
{
    SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
    if (doNotFireEvents)
    {
        try
        {
            rh.DisableEventFiring();
            item.Update();
        }
        finally
        {
            rh.EnableEventFiring();
        }
    }
    else
    {
        item.Update();
    }
}

/// <summary>
/// Provides ability to update list item without firing event receiver.
/// </summary>
/// <param name="item"></param>
/// <param name="incrementListItemVersion"></param>
/// <param name="doNotFireEvents">Disables firing event receiver while updating item.</param>
public static void SystemUpdate(this SPListItem item, bool incrementListItemVersion, bool doNotFireEvents)
{
    SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
    if (doNotFireEvents)
    {
        try
        {
            rh.DisableEventFiring();
            item.SystemUpdate(incrementListItemVersion);
        }
        finally
        {
            rh.EnableEventFiring();
        }
    }
    else
    {
        item.SystemUpdate(incrementListItemVersion);
    }
}

/// <summary>
/// Provides ability to update list item without firing event receiver.
/// </summary>
/// <param name="item"></param>
/// <param name="doNotFireEvents">Disables firing event receiver while updating item.</param>
public static void SystemUpdate(this SPListItem item, bool doNotFireEvents)
{
    SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
    if (doNotFireEvents)
    {
        try
        {
            rh.DisableEventFiring();
            item.SystemUpdate();
        }
        finally
        {
            rh.EnableEventFiring();
        }
    }
    else
    {
        item.SystemUpdate();
    }
}

private class SPItemEventReceiverHandling : SPItemEventReceiver
{
    public SPItemEventReceiverHandling() { }

    new public void DisableEventFiring()
    {
        base.DisableEventFiring();
    }

    new public void EnableEventFiring()
    {
        base.EnableEventFiring();
    }


   }
}

答案 1 :(得分:8)

答案 2 :(得分:2)

似乎Microsoft在SharePoint 2010中重写了这一点,EventFiringEnabled和EventFiringDisabled已经过时了。

而是使用名为EventFiringEnabled的布尔属性。

答案 3 :(得分:0)

如果通过更改该字段触发更新,您是否可以在工作流程的开头添加一个步骤来终止工作流程? (使用该服务更新的那个。)

使用该服务更新列表时,您可以在列表项上设置隐藏的布尔字段,并将其设置为true。然后,在工作流程的开头,您可以检查此字段是否设置为true。

答案 4 :(得分:-2)

您可以在当前项中使用设置字段,而不是更新列表项

设置字段更新列表项而不触发新事件