Проблема в том, что форма запуска рабочего процесса SharePoint кэширует элемент списка рабочего процесса в PageLoad, и когда вы вносите изменения в элемент между загрузкой страницы и вызовом HandleStartWorkflow (т. Е. Нажатием кнопки «Начать рабочий процесс»), SharePoint начинает волноваться, что элемент, о котором вы говорите, отличается (кэшированный элемент) от элемента, который существует в Share Point (который включает только что сделанные вами изменения).
Основные шаги по воспроизведению проблемы:
- Запустите рабочий процесс, чтобы появилась форма инициализации.
- Изменить некоторые свойства в WorkflowProperties.Item
- Вызовите WorkflowProperties.Item.Update, чтобы сохранить изменения в SharePoint
- Call HandleStartWorkflow.
Вы получите ошибку.
Ошибка может показаться нерегулярной, если в течение некоторого времени изменение свойств элемента рабочего процесса выполняется в отдельном сеансе загрузки страницы к сеансу, когда нажимается кнопка «Начать рабочий процесс». Например, если вы отправляете PostBack некоторые данные формы, а затем нажимаете кнопку Пуск рабочего процесса, то все работает, потому что произошел PostBack, а затем страница была загружена.
Но если вы используете событие ASP TextBox OnTextChanged, измените текст и затем нажмите кнопку «Начать рабочий процесс», событие OnChanged будет запущено ПОСЛЕ загрузки страницы старыми данными, данные будут изменены на новые данные и рабочий процесс запускается до повторной загрузки данных элемента из SharePoint.
Исправить несложно: перезагрузите данные элемента рабочего процесса ПРОСТО перед началом рабочего процесса. Это приведет к тому, что ваш кэшированный элемент рабочего процесса и версия элемента 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
И все должно снова заработать.