Phi*_*mid 11 sharepoint workflow
我有一个SharePoint工作流程,只要项目发生变化就会运行.工作流与外部REST服务通信.如果服务返回一个字符串,我想用该字符串更新其中一个字段值.不幸的是,一旦当前工作流终止,此更新将触发此项的工作流的另一个实例.我最终得到了一个无限循环!
我怎么能防止这种情况发生?SPListItem具有Update(),UpdateOverwriteVersion()和SystemUpdate()方法,但它们似乎都不会阻止后续工作流被触发.
我可以检查项目的最后修改时间戳,并在最后一次更新发生在特定时间范围内时终止工作流程,但我正在寻找更强大的解决方案.
Jan*_*rgs 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
更多链接,因为上述解决方案不适用于2010年:
最好的解决方案:
| 归档时间: |
|
| 查看次数: |
39970 次 |
| 最近记录: |