问题是 SharePoint 工作流启动表单缓存了 PageLoad 上的工作流列表项,并且当您在页面加载和调用 HandleStartWorkflow 之间对项目进行更改(即单击“启动工作流”按钮)时,SharePoint 会吓坏您的项目'正在谈论的(缓存的项目)与 Share Point 中存在的项目(包含您刚刚所做的更改)不同。
重现问题的一般步骤是:
- 启动工作流,以便显示启动表单。
- 更改 WorkflowProperties.Item 上的某些属性
- 调用 WorkflowProperties.Item.Update 以将更改保存到 SharePoint
- 调用 HandleStartWorkflow。
你会得到错误。
如果有时在单击“启动工作流”按钮的会话的单独页面加载“会话”中对工作流项属性进行更改,则该错误可能看起来是间歇性的。例如,如果您 PostBack 一些表单数据,然后单击 Start workflow 按钮,那么一切正常,因为 PostBack 发生了,然后页面被加载。
但是,如果您使用 ASP TextBox OnTextChanged 事件,更改文本然后单击 Start Workflow 按钮,则在页面加载旧数据后触发 OnChanged 事件,将数据更改为新数据并在之前启动工作流从 SharePoint 重新加载项目数据。
修复很简单:在启动工作流之前重新加载工作流项数据。这将导致您缓存的工作流项目和项目的共享点版本相同,共享点会很高兴。
在“工作流启动代码”区域中,更改:
Private Sub StartListWorkflow()
Dim association As SPWorkflowAssociation = workflowList.WorkflowAssociations.Item(New Guid(associationGuid))
Web.Site.WorkflowManager.StartWorkflow(workflowListItem, association, GetInitiationData)
SPUtility.Redirect(workflowList.DefaultViewUrl, SPRedirectFlags.UseSource, System.Web.HttpContext.Current)
End Sub
到
Private Sub StartListWorkflow()
'Re-initialize the workflow parameters, particularly the workflowListItem, in case it has been changed since page load.'
InitializeParams()
Dim association As SPWorkflowAssociation = workflowList.WorkflowAssociations.Item(New Guid(associationGuid))
Web.Site.WorkflowManager.StartWorkflow(workflowListItem, association, GetInitiationData)
SPUtility.Redirect(workflowList.DefaultViewUrl, SPRedirectFlags.UseSource, System.Web.HttpContext.Current)
End Sub
一切都应该重新开始工作。