問題は、SharePoint ワークフロー開始フォームがワークフローのリスト アイテムを PageLoad にキャッシュすることです。ページの読み込みと HandleStartWorkflow の呼び出し (つまり、[ワークフローの開始] ボタンのクリック) の間にアイテムに変更を加えると、SharePoint はそのアイテムをびっくりさせます。これは、Share Point に存在するアイテム (今行った変更が組み込まれている) とは異なります (キャッシュされたアイテム)。
問題を再現するための一般的な手順は次のとおりです。
- 開始フォームが表示されるように、ワークフローを開始します。
- WorkflowProperties.Item のいくつかのプロパティを変更します
- WorkflowProperties.Item.Update を呼び出して、変更を SharePoint に保存します。
- HandleStartWorkflow を呼び出します。
エラーが発生します。
ワークフロー アイテムのプロパティの変更が、[ワークフローの開始] ボタンをクリックしたセッションとは別のページ ロード「セッション」で行われる場合、エラーが断続的に発生することがあります。たとえば、いくつかのフォーム データをポストバックしてから [ワークフローの開始] ボタンをクリックすると、ポストバックが発生してからページが読み込まれるため、すべてが機能します。
ただし、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
そして、すべてが再び機能し始めるはずです。