在 Visual Studio 2010 中创建 SharePoint 2010 状态机

SharePoint 可视操作方法

**摘要:**了解如何使用 Microsoft Visual Studio 2010 中的状态机工作流模板构建 Microsoft SharePoint 2010 状态机工作流。

上次修改时间: 2012年9月12日

适用范围: SharePoint Foundation 2010 | SharePoint Server 2010 | Visual Studio | Visual Studio 2008 | Visual Studio 2010

**供稿人:**Ben Hedges,Point8020

概述

Microsoft Visual Studio 2010 提供了状态机工作流模板,通过该模板,您可以使用图形设计图面构建适用于 Microsoft SharePoint 2010 的工作流解决方案。与从一种活动转换到另一种活动的顺序工作流不同,状态机工作流从一种状态转换到另一种状态。

编码

该 SharePoint 直观操作方法介绍了用于创建状态机工作流并将其部署到 SharePoint 2010 网站的以下步骤:

  1. 创建名为 Projects 的先决条件文档库。

  2. 为 stateInProgress、stateReview 和 stateFinished 添加状态活动。

  3. 为每个状态配置状态初始化和事件。

  4. 配置用于确定状态转换的代码。

先决条件

该工作流需要名为 Projects 的特定文档库。

创建 Projects 文档库

  1. 在"网站操作"菜单上,单击"其他选项"。

  2. 在已安装的项目列表中,单击"文档库"。

  3. 在屏幕右侧的名称框中,键入 Projects,然后单击"创建"。

创建工作流

首先,在 Visual Studio 2010 中创建 SharePoint"状态机工作流"项目。

在 Visual Studio 2010 中创建 SharePoint 状态机工作流项目

  1. 在 Visual Studio 中的"文件"菜单上,单击"新建",然后单击"项目"。

  2. 在"已安装的模板"部分,展开"Visual Basic"或"C#",展开"SharePoint",然后单击"2010"。

  3. 在模板窗格中,单击"状态机工作流"。

  4. 在"名称"框中,键入 stateWorkflow。保留其他字段的默认值不变,然后单击"确定"。

  5. 在"SharePoint 自定义向导"的"要使用哪个本地站点进行调试?"列表中,选择您的网站,然后单击"下一步"。

  6. 在"指定用于调试的工作流名称"页上,保留默认名称,并确保选择了"列表工作流"。单击"下一步"。

  7. 在"选择要在调试时使用的列表"页上标为"要与工作流关联的库或列表"的列表中,选择"Projects"。保留其他选项的默认设置不变,然后单击"下一步"。

  8. 在"指定确定工作流启动方式的条件"页上,单击"完成"。

将显示包含 Workflow1IntitalState 活动的设计图面。

向工作流添加状态

  1. 在工具箱的"Windows 工作流 3"组中,将三个 State 活动拖到设计图面上。

  2. 单击 WorkFlow1InitialState 活动,并在"属性"窗格的 Name 属性中,将此状态重命名为 InitialState。

  3. 单击 stateActivity1 活动,并在"属性"窗格的 Name 属性中,将此状态重命名为 stateInProgress。

  4. 单击 stateActivity2 活动,并在"属性"窗格的 Name 属性中,将此状态重命名为 stateReview。

  5. 单击 stateActivity3 活动,并在"属性"窗格的 Name 属性中,将此状态重命名为 stateFinished。

    图 1 显示了添加到设计图面的三个状态。

    图 1. 向设计图面添加状态


    向设计图面中添加状态

设置初始状态和已完成状态

  1. 右键单击标为"InitialState"的状态,然后单击"设置为初始状态"。

  2. 右键单击标为"stateFinished"的状态,然后单击"设置为已完成状态"。

配置 InitialState 活动

  1. 在 InitialState 活动中,双击 eventDrivenActivity1。将显示一个新视图。

    图 2. 初始状态活动


    初始状态工作流

  2. 拖动工具箱中的 SetState 活动,并将它放置在 onWorkflowActivated1 活动下。

  3. 在"属性"窗格的"TargetStateName"属性中,单击下拉列表,并选择"stateInProgress"。

  4. 在设计图面上单击"Workflow1"以返回完整工作流视图。

配置 stateInProgress 活动

  1. 右键单击 stateInProgress 活动,然后单击 AddStateInitialization。

  2. 在"属性"窗格中,将 stateInitializationActivity1 重命名为 stateInProgressInitialization。

  3. 在工具箱的"SharePoint 工作流"选项中,拖动 CreateTask 活动并将它添加到 stateInProgressInitialization 拖放区域。

  4. 在"属性"窗格的 CorrelationToken 属性中,键入 InProgressToken,并按 Enter。

  5. 在"属性"窗格中,展开 CorrelationToken 属性,并在"OwnerActivityName"列表中,选择"stateInProgress"。

  6. 在"属性"窗格的 TaskID 属性中,单击值,然后单击省略号按钮 (...)。

  7. 在"将‘TaskID’绑定到活动的属性"对话框中,单击"绑定到新成员"选项卡。

  8. 在"选择要创建的成员的类型"选项列表中,单击"创建字段"。单击"确定"。

  9. 在"属性"窗格中,单击 TaskProperties 属性,然后单击省略号按钮 (...)。

  10. 在"将‘TaskProperties’绑定到活动的属性"对话框中,单击"绑定到新成员"选项卡。

  11. 在"选择要创建的成员的类型"选项列表中,单击"创建字段",然后单击"确定"。

  12. 在"属性"窗格的 MethodInvoking 属性中,键入 createTask1_MethodInvoking,并按 Enter。

  13. 添加以下代码。

    createTask1_TaskId1 = Guid.NewGuid()
    createTask1_TaskProperties1.Title = "Finish Document"
    createTask1_TaskProperties1.AssignedTo = "CONTOSO\sanjays"
    createTask1_TaskProperties1.DueDate = Date.Now.AddDays(1.0)
    createTask1_TaskId1 = Guid.NewGuid();
    createTask1_TaskProperties1.Title = "Finish Document";
    createTask1_TaskProperties1.AssignedTo = @"CONTOSO\sanjays";
    createTask1_TaskProperties1.DueDate = DateTime.Now.AddDays(1.0);
  14. 单击"设计"选项卡,然后单击"Workflow1"以返回完整工作流视图。

  15. 右键单击 stateInProgress 活动,然后单击"AddEventDriven"。

  16. 在工具箱的"SharePoint 工作流"选项中,将"onTaskChanged"项拖动到"stateInProgress"拖放区域。

  17. 在"属性"窗格中,单击 TaskID 属性,然后单击省略号按钮 (...)。

  18. 在"将‘TaskID’绑定到活动的属性"对话框中的"绑定到现有成员"选项卡上,单击"createTask1_TaskId1"。单击"确定"。

  19. 在"属性"窗格中,单击"AfterProperties"字段,然后单击省略号按钮 (...)。

  20. 在"将‘AfterProperties’绑定到活动的属性"对话框中,单击"绑定到新成员"选项卡。

  21. 在"选择要创建的成员的类型"选项列表中,单击"创建字段",然后单击"确定"。

  22. 在"属性"窗格中,单击"BeforeProperties"字段,然后单击省略号按钮 (...)。

  23. 在"将‘BeforeProperties’绑定到活动的属性"对话框中,单击"绑定到新成员"选项卡。

  24. 在"选择要创建的成员的类型"选项列表中,单击"创建字段"。单击"确定"。

  25. 在"属性"窗格的 CorrelationToken 属性中,选择"InProgressToken"。

  26. 在"属性"窗格的 Invoked 属性中,键入 onTaskChanged1_Invoked,然后按 Enter。

  27. 添加以下代码:

    onTaskChanged1_AfterProperties1 = onTaskChanged1.AfterProperties
    onTaskChanged1_BeforeProperties1 = onTaskChanged1.BeforeProperties
    onTaskChanged1_AfterProperties1 = onTaskChanged1.AfterProperties;
    onTaskChanged1_BeforeProperties1 = onTaskChanged1.BeforeProperties;
  28. 单击"设计"选项卡。在工具箱的"Windows 工作流 3"组中,将 IfElse 活动拖动到 OnTaskedChange1 活动下。

  29. 在"Workflow1"代码视图中,添加以下代码。

    Private Sub ReadyForReview(ByVal sender As Object, _
                           ByVal e As ConditionalEventArgs)
        If onTaskChanged1_AfterProperties1.PercentComplete = 1.0 Then
            e.Result = True
        Else
            e.Result = False
        End If
    End Sub
    private void ReadyForReview(object sender, ConditionalEventArgs e)
      {
          if (onTaskChanged1_AfterProperties1.PercentComplete == 1.0)
          {
              e.Result = true;
          }
          else
          {
              e.Result = false;
          }
      }
  30. 单击"设计"选项卡,然后单击 ifElseBranchActivity1。在"属性"窗格中,单击 Condition 属性,然后在下拉列表中选择"代码条件"。

  31. 在"属性"窗格中,展开 Condition 属性。在下拉列表中,选择"ReadyForReview"。

  32. 在工具箱的"Windows 工作流 3"组中,将 SetState 活动拖动到"IfElseBranchActivity1"拖放区域。

  33. 在"属性"窗格中,单击"TargetStateName",然后在下拉列表中单击"stateReview"。

    图 3. StateInProgress 活动


    StateInProgress 活动

  34. 在设计图面上,单击"Workflow1"以返回完整工作流视图。

配置 stateReview 活动

  1. 右键单击 stateReview 活动,然后单击 AddStateInitialization。

  2. 在工具箱的"SharePoint 工作流"选项中,将 CreateTask 活动拖动到"stateInitializationActivity1"拖放区域。

  3. 在"属性"窗格中,单击 (Name) 属性并将它重命名为 createReviewTask。

  4. 在"属性"窗格的 CorrelationToken 属性中,键入 ReviewStateToken,并按 Enter。

  5. 在"属性"窗格中,展开 CorrelationToken 属性,并在"OwnerActivityName"列表中,选择"stateReview"。

  6. 在"属性"窗格中,单击 TaskID,然后单击省略号按钮 (...)。

  7. 在"将‘TaskID’绑定到活动的属性"对话框中,单击"绑定到新成员"选项卡。

  8. 在"选择要创建的成员的类型"选项列表中,单击"创建字段",然后单击"确定"。

  9. 在"属性"窗格中,单击 TaskProperties 属性,然后单击省略号按钮 (...)。

  10. 在"将‘TaskProperties’绑定到活动的属性"对话框中,单击"绑定到新成员"选项卡。

  11. 在"选择要创建的成员的类型"选项列表中,单击"创建字段",然后单击"确定"。

  12. 在"属性"窗格的 MethodInvoking 处理程序中,键入 createReviewTask_MethodInvoking,然后按 Enter。

  13. 添加以下代码。

    createReviewTask_TaskId1 = Guid.NewGuid()
    createReviewTask_TaskProperties1.Title = "Review Document"
    createReviewTask_TaskProperties1.AssignedTo = "CONTOSO\andyj"
    createReviewTask_TaskProperties1.DueDate = Date.Now.AddDays(1.0)
    createReviewTask_TaskId1 = Guid.NewGuid();
    createReviewTask_TaskProperties1.Title = "Review Document";
    createReviewTask_TaskProperties1.AssignedTo = @"CONTOSO\andyj";
    createReviewTask_TaskProperties1.DueDate = DateTime.Now.AddDays(1.0);
  14. 单击"设计"图面,然后单击"Workflow1"以返回完整工作流视图。

  15. 右键单击 stateReview 活动,然后单击"AddEventDriven"。

  16. 在工具箱的"SharePoint 工作流"选项中,将"onTaskChanged"项拖动到"stateReview"拖放区域。

  17. 在"属性"窗格中,将"CorrelationToken"设置为"ReviewStateToken"。

  18. 在"属性"窗格中,单击 TaskID 属性,然后单击省略号按钮 (...)。

  19. 在"将‘TaskID’绑定到活动的属性"对话框中的"绑定到现有成员"选项卡上,单击"createReviewTask_TaskId1",然后单击"确定"。

  20. 在"属性"窗格中,单击"AfterProperties"字段,然后单击省略号按钮 (...)。

  21. 在"将‘AfterProperties’绑定到活动的属性"对话框中,单击"绑定到新成员"选项卡。

  22. 在"选择要创建的成员的类型"选项列表中,单击"创建字段",然后单击"确定"。

  23. 在"属性"窗格中,单击"BeforeProperties"字段,然后单击省略号按钮 (...)。

  24. 在"将‘BeforeProperties’绑定到活动的属性"对话框中,单击"绑定到新成员"选项卡。

  25. 在"选择要创建的成员的类型"选项列表中,单击"创建字段",然后单击"确定"。

  26. 在"属性"窗格的 Invoked 处理程序中,键入 onTaskChanged2_Invoked,然后按 Enter。

  27. 添加以下代码。

    onTaskChanged2_AfterProperties1 = onTaskChanged2.AfterProperties
    onTaskChanged2_BeforeProperties1 = onTaskChanged2.BeforeProperties
    onTaskChanged2_AfterProperties1 = onTaskChanged2.AfterProperties;
    onTaskChanged2_BeforeProperties1 = onTaskChanged2.BeforeProperties;
  28. 单击"设计"选项卡。在工具箱的"Windows 工作流 3"组中,将 IfElse 活动拖动到 OnTaskedChange2 活动下。

  29. 打开"Workflow1"代码视图,并添加以下代码。

    Private Sub ReviewFinished(ByVal sender As Object, _
                               ByVal e As ConditionalEventArgs)
         If onTaskChanged2_AfterProperties1.PercentComplete = 1.0 Then
               e.Result = True
          Else
               e.Result = False
          End If
    End Sub
    private void ReviewFinished(object sender, ConditionalEventArgs e)
            {
                if (onTaskChanged2_AfterProperties1.PercentComplete == 1.0)
                {
                    e.Result = true;
                }
                else
                {
                    e.Result = false;
                }
            }
  30. 单击"设计"选项卡,然后单击"ifElseBranchActivity3"。在"属性"窗格中,单击 Condition 属性,并在下拉列表中选择"代码条件"。

  31. 在"属性"窗格中,展开 Condition 属性。

  32. 在展开的条件字段中,在下拉列表中选择"ReviewFinished"。

  33. 从工具箱的"Windows 工作流 3"组中,拖动 IfElse 活动,并将它添加到 ifElseActivity3 活动下的"在此处放置活动"区域。

    这将创建嵌套 If/Else 语句。

  34. 在"Workflow1"代码视图中,添加以下代码。

    Private Sub DocApproved(ByVal sender As Object, _
                            ByVal e As ConditionalEventArgs)
            If onTaskChanged2_AfterProperties1.Description = "<DIV>Approved</DIV>" Then
                e.Result = True
            Else
                e.Result = False
            End If
        End Sub
    private void DocApproved(object sender, ConditionalEventArgs e)
      {
          if (onTaskChanged2_AfterProperties1.Description == "<DIV>Approved</DIV>")
          {
              e.Result = true;
          }
          else
          {
              e.Result = false;
          }
      }
  35. 单击"设计"选项卡,然后单击"ifElseBranchActivity5"。在"属性"窗格中,单击 Condition 属性,并在下拉列表中选择"代码条件"。

  36. 在"属性"窗格中,展开 Condition 属性。在展开的条件字段中,在下拉列表中选择"DocApproved"。

  37. 在工具箱中,将 SetState 活动拖动到 ifElseBranchActivity5 活动下。

  38. 在"属性"窗格中,单击 TargetStateName 属性,然后选择"stateFinished"。

  39. 在工具箱中,将 SetState 活动拖动到 ifElseBranchActivity6 活动下。

  40. 在"属性"窗格中,单击 TargetStateName 属性,然后选择"stateInProgress"。

    图 4 显示完成的状态机工作流。

    图 4. 完成的状态机工作流


    完成的状态机工作流

部署项目

最后,部署项目并测试工作流。

部署项目

  1. 在解决方案资源管理器中,右键单击该项目,然后单击"部署"

  2. 打开 SharePoint 主页。

  3. 在"快速启动"菜单上,单击"Projects",然后单击"添加文档"。

  4. 在"上载文档"对话框中,单击"浏览",选择一个文档,然后单击"打开"。在"上载"对话框中,单击"确定"。

  5. 打开"任务"库,并查看"Finish Document"任务。

  6. 编辑"Finish Document"任务,并在"完成百分比"框中,键入 100。单击"保存"。

    查看"Review Document"任务。

  7. 编辑"Review Document"任务,将状态设置为"已完成",并将"完成百分比"设置为 100。在"说明"中,键入 Approved,然后单击"保存"。

  8. 打开 Projects 文档库,您会发现文档工作流已完成。

    读取

Visual Studio 2010 中的状态机工作流项目提供一个图形设计图面,可在其中构建工作流。

  • 初始状态具有一个 SetState 活动,该活动使工作流直接进入 stateInProgress 状态。

  • stateInProgress 状态具有一个任务活动,该活动生成标题为"Finish Document"的新任务,并将任务指派给指定的用户。

  • stateInProgress 具有一个 onTaskChanged 活动,当任务发生更改时调用该活动。inTaskChanged 活动具有 IfElse 语句,该语句将任务的"完成百分比"与 1.0 (100%) 进行比较。

  • 如果条件为 true,则工作流转换到下一状态 (stateReview)。如果为 false,则工作流仍处于此状态。

  • 在 stateReview 状态中,状态初始化期间生成标题为"Review Document"的任务,并且同样将此任务指派给指定的用户。

  • stateReview 状态在任务更改时调用,并且 IfElse 语句将此任务的"完成百分比"与 100% 进行比较。与前面一样,任务 100% 完成时,工作流将继续。

  • 任务 100% 完成时,将达到 stateReview 状态中的嵌套 IfElse 语句。代码将任务说明中显示的文本与字符串"<DIV>Approved</DIV>"进行比较。

  • 如果字符串相匹配,则认为该阶段已完成,工作流继续进行直到达到 StateFinished。如果字符串不匹配,则状态将返回 stateInProgress。

观看

观看视频

观看视频(该链接可能指向英文页面) (00:15:37)

单击以获取代码

获取代码(该链接可能指向英文页面)

浏览

关于作者

Ben HedgesPoint8020 公司的研发高级副总裁。Ben 对构建有关 SharePoint 的人才管理、合规性以及学习和开发解决方案的模型尤其感兴趣。Ben 具有使用 Microsoft 技术实现客户要求的丰富经验。