演练:创建带有关联窗体和启动窗体的工作流

本演练演示如何创建结合使用关联窗体和启动窗体的基本顺序工作流。 关联窗体和启动窗体都是 ASPX 窗体,在 SharePoint 管理员首次关联工作流(关联窗体)时以及在用户启动工作流(启动窗体)时,可利用这些窗体将参数添加到工作流中。

本演练概述了一个应用场景,即用户希望为零用金报销单创建一个具有下列要求的审批工作流:

  • 当工作流与一个列表关联时,将为管理员显示一个关联窗体以让其输入零用金报销单的金额限制。

  • 雇员将零用金报销单上载到“共享文档”列表,启动工作流,然后在工作流启动窗体中输入费用总额。

  • 如果某个雇员的零用金报销单的费用总额超出了管理员预定义的限额,则为雇员的经理创建一个任务来审批零用金报销单。 但是,如果雇员的零用金报销单的费用总额小于或等于费用限额,则将自动批准的消息写入到工作流的历史记录列表中。

本演练阐释了以下任务:

  • 在 Visual Studio 中创建 SharePoint 列表定义顺序工作流项目。

  • 创建工作流时间表。

  • 处理工作流活动事件。

  • 创建工作流关联窗体和工作流启动窗体。

  • 关联工作流。

  • 手动启动工作流。

提示

虽然本演练使用的是顺序工作流项目,但过程与状态机工作流的过程相同。

此外,以下说明中的某些 Visual Studio 用户界面元素与在您的计算机上显示的名称或位置不同。 您安装的 Visual Studio 版本以及使用的设置决定了这些元素。 有关更多信息,请参见 使用设置

系统必备

您需要以下组件来完成本演练:

创建 SharePoint 顺序工作流项目

首先,在 Visual Studio 中创建一个顺序工作流项目。 顺序工作流是一系列步骤,这些步骤按顺序执行,直到最后一项活动完成。 在此过程中,您将创建一个应用于 SharePoint 中的“共享文档”列表的顺序工作流。 利用此工作流的向导,您可以将此工作流与网站或列表定义关联,并可以确定工作流的启动时间。

创建 SharePoint 顺序工作流项目

  1. 通过指向**“文件”菜单上的“新建”并单击“新建项目”,显示“新建项目”**对话框。

  2. 展开**“Visual C#”“Visual Basic”下的“SharePoint”节点,然后单击“2010”**。

  3. 在**“模板”窗格中选择“顺序工作流”**。

  4. 在**“名称”框中,键入 ExpenseReport,然后单击“确定”**。

    这将显示**“SharePoint 自定义向导”**。

  5. 在**“要使用哪个本地网站进行调试?”页中,单击“下一步”**以接受默认网站。

    此步骤还会将解决方案的信任级别设置为场解决方案(工作流项目的唯一可用选项)。

  6. 在**“指定用于调试的工作流名称”页上,接受默认名称(“ExpenseReport - Workflow1”)。 保留默认工作流模板类型值(“列表工作流”)。 单击“下一步”**。

  7. 在**“是否希望 Visual Studio 在调试会话中自动关联工作流?”**页中,清除用于自动关联工作流模板的框(如果该框处于选中状态)。

    利用此步骤,您可以稍后手动将工作流与显示关联窗体的“共享文档”列表关联。

  8. 单击**“完成”**。

将关联窗体添加到工作流

接下来,创建一个 .ASPX 关联窗体,当 SharePoint 管理员首次将工作流与零用金报销单文档相关联时,将显示此窗体。

将关联窗体添加到工作流

  1. 单击**“解决方案资源管理器”中的“Workflow1”**节点。

  2. 单击**“项目”菜单上的“添加新项”以显示“添加新项”**对话框。

  3. 在该对话框树视图中,展开**“Visual C#”“Visual Basic”(取决于项目语言),再展开“SharePoint”节点,然后单击“2010”**。

  4. 在模板列表中,选择**“工作流关联窗体”**。

  5. 在**“名称”**文本框中,键入 ExpenseReportAssocForm.aspx。

  6. 单击**“添加”**按钮将该窗体添加到项目中。

设计关联窗体并对其进行编码

在此过程中,通过在关联窗体中添加控件和代码来引入功能。

设计关联窗体并对其进行编码

  1. 在关联窗体 (ExpenseReportAssocForm.aspx) 中,找到具有 ID="Main" 的 asp:Content 元素。

  2. 紧接在此内容元素中的第一行后面添加以下代码,以创建一个用于提示输入费用审批限额 (AutoApproveLimit) 的标签和文本框:

    <asp:Label ID="lblAutoApproveLimit" Text="Auto Approval Limit:" runat="server" />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <asp:TextBox ID="AutoApproveLimit" runat="server" />
    <br /><br />
    
  3. 展开**“解决方案资源管理器”中的“ExpenseReportAssocForm.aspx”**文件以显示其从属文件。

    提示

    如果项目位于 Visual Basic 中,则必须单击“查看所有文件”按钮才能执行此步骤。

  4. 右击 ExpenseReportAssocForm.aspx 文件并选择**“查看代码”**。

  5. 将 GetAssociationData 方法替换为:

    Private Function GetAssociationData() As String
        ' TODO: Return a string that contains the association data that 
        ' will be passed to the workflow. Typically, this is in XML 
        ' format.
        Return Me.AutoApproveLimit.Text
    End Function
    
    private string GetAssociationData()
    {
        // TODO: Return a string that contains the association data that 
        // will be passed to the workflow. Typically, this is in XML 
        // format.
        return this.AutoApproveLimit.Text;
    }
    

将启动窗体添加到工作流

接下来,创建在用户针对其零用金报销单运行工作流时显示的启动窗体。

创建启动窗体

  1. 单击**“解决方案资源管理器”中的“Workflow1”**节点。

  2. 单击**“项目”菜单上的“添加新项”以显示“添加新项”**对话框。

  3. 在该对话框树视图中,展开**“Visual C#”“Visual Basic”(取决于项目语言),再展开“SharePoint”节点,然后单击“2010”**。

  4. 在模板列表中,选择**“工作流启动窗体”**。

  5. 在**“名称”**文本框中,键入 ExpenseReportInitForm.aspx。

  6. 单击**“添加”**按钮将该窗体添加到项目中。

设计启动窗体并对其进行编码

接下来,通过在启动窗体中添加控件和代码来引入功能。

对启动窗体进行编码

  1. 在启动窗体 (ExpenseReportInitForm.aspx) 中,找到具有 ID="Main" 的 asp:Content 元素。

  2. 紧接在此内容元素中的第一行后面添加以下代码,以创建一个显示已在关联窗体中输入的费用审批限额 (AutoApproveLimit) 的标签和文本框,以及另一个提示输入费用总额 (ExpenseTotal) 的标签和文本框:

    <asp:Label ID="lblAutoApproveLimit" Text="Auto Approval Limit:" runat="server" />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <asp:TextBox ID="AutoApproveLimit" ReadOnly="true" runat="server" />
    <br /><br />
    <asp:Label ID="lblExpenseTotal" Text="Expense Total:" runat="server" />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <asp:TextBox ID="ExpenseTotal" runat="server" />
    <br /><br />
    
  3. 展开**“解决方案资源管理器”中的“ExpenseReportInitForm.aspx”**文件以显示其从属文件。

  4. 右击 ExpenseReportInitForm.aspx 文件并选择**“查看代码”**。

  5. 将 Page_Load 方法替换为以下示例:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As 
      EventArgs) Handles Me.Load
        InitializeParams()
        Me.AutoApproveLimit.Text = workflowList.WorkflowAssociations(New 
          Guid(associationGuid)).AssociationData
        ' Optionally, add code here to pre-populate your form fields.
    End Sub
    
    protected void Page_Load(object sender, EventArgs e)
    {
        InitializeParams();
        this.AutoApproveLimit.Text = 
          workflowList.WorkflowAssociations[new 
          Guid(associationGuid)].AssociationData;
    }
    
  6. 将 GetInitiationData 方法替换为以下示例:

    ' This method is called when the user clicks the button to start the workflow.
    Private Function GetInitiationData() As String
        Return Me.ExpenseTotal.Text
        ' TODO: Return a string that contains the initiation data that 
        ' will be passed to the workflow. Typically, this is in XML 
        ' format.
        Return String.Empty
    End Function
    
    // This method is called when the user clicks the button to start the workflow.        
    private string GetInitiationData()
    {
        // TODO: Return a string that contains the initiation data that 
        // will be passed to the workflow. Typically, this is in XML 
        // format.
        return this.ExpenseTotal.Text;
    }
    

自定义工作流

接下来,自定义工作流。 然后,将两个窗体关联到工作流。

自定义工作流

  1. 通过双击项目中的 Workflow1,在工作流设计器中显示工作流。

  2. 在工具箱中,展开**“Windows Workflow v3.0”节点,并找到“IfElse”**活动。

  3. 通过将此活动拖动到设计器中并将其放置在工作流中的**“onWorkflowActivated1”**活动下方,将此活动添加到工作流中。 这将在设计器中创建一个称作 IfElseActivity1 的活动。

  4. 在工具箱中,展开**“SharePoint 工作流”节点并找到“CreateTask”**活动。

  5. 通过将此活动拖放到 IfElseActivity1 中的两个**“将 Activity 拖放至此”**区域之一,将此活动添加到工作流中。

  6. 在**“属性”**窗口中,为 CorrelationToken 属性输入属性值 taskToken。

  7. 通过单击 CorrelationToken 属性旁边的加号 (TreeView 加号) 来展开此属性。

  8. 单击 OwnerActivityName 子属性上的下拉箭头并选择 Workflow1。

  9. 单击 TaskId 属性,然后单击省略号 (ASP.NET 移动设计器中的省略号) 按钮以显示**“绑定属性”**对话框。

  10. 单击**“绑定到新成员”选项卡,选择“创建字段”,然后单击“确定”**。

  11. 单击 TaskProperties 属性,然后单击省略号 (ASP.NET 移动设计器中的省略号) 按钮以显示**“绑定属性”**对话框。

  12. 单击**“绑定到新成员”选项卡,选择“创建字段”,然后单击“确定”**。

  13. 在工具箱中,展开**“SharePoint 工作流”节点并找到“LogToHistoryListActivity”**活动。

  14. 通过将此活动拖放到 IfElseActivity1 中的另一个**“将 Activity 拖放至此”**区域,将此活动添加到工作流中。

在工作流中添加代码

接下来,在工作流中添加代码以引入功能。

在工作流中添加代码

  1. 在工作流设计器中双击**“createTask1”**活动,为 MethodInvoking 事件生成一个空方法。

  2. 将 MethodInvoking 方法替换为:

    Private Sub createTask1_MethodInvoking(ByVal sender As 
      System.Object, ByVal e As System.EventArgs)
        createTask1_TaskId1 = Guid.NewGuid
        createTask1_TaskProperties1.AssignedTo = "somedomain\\someuser"
        createTask1_TaskProperties1.Description = "Please approve the 
          expense report"
        createTask1_TaskProperties1.Title = "Expense Report Approval 
          Needed"
    End Sub 
    
    private void createTask1_MethodInvoking(object sender, EventArgs e)
    {
        createTask1_TaskId1 = Guid.NewGuid();
        createTask1_TaskProperties1.AssignedTo = "somedomain\\someuser";
        createTask1_TaskProperties1.Description = "Please approve the 
          expense report";
        createTask1_TaskProperties1.Title = "Expense Report Approval 
          Needed";
    } 
    

    提示

    在代码中,将 somedomain\\someuser 替换为将为其创建任务的域和用户名,如“Office\\JoeSch”。 使用开发时所用的帐户进行测试最为轻松。

  3. 在 MethodInvoking 方法下添加以下示例:

    Private Sub checkApprovalNeeded(ByVal sender As Object, ByVal e As 
      ConditionalEventArgs)
        Dim approval As Boolean = False
        If (Convert.ToInt32(workflowProperties.InitiationData) > 
          Convert.ToInt32(workflowProperties.AssociationData)) Then
            approval = True
        End If
        e.Result = approval
    End Sub 
    
    private void checkApprovalNeeded(object sender, ConditionalEventArgs 
      e)
    {
        bool approval = false;
        if (Convert.ToInt32(workflowProperties.InitiationData) > 
          Convert.ToInt32(workflowProperties.AssociationData))
        {
            approval = true;
        }
        e.Result = approval;
    } 
    
  4. 在工作流设计器中,单击**“ifElseBranchActivity1”**活动。

  5. 在**“属性”窗口中,单击“Condition”**属性的下拉箭头并选择 Code Condition。

  6. 通过单击**“Condition”**属性旁边的加号 (TreeView 加号) 来展开此属性,然后将其值设置为 checkApprovalNeeded。

  7. 在工作流设计器中,右击**“logToHistoryListActivity1”活动并选择“生成处理程序”**,以便为 MethodInvoking 事件生成空方法。

  8. 将 MethodInvoking 代码替换为下面的内容:

    Private Sub logToHistoryListActivity1_MethodInvoking(ByVal sender As 
      System.Object, ByVal e As System.EventArgs)
        Me.logToHistoryListActivity1.HistoryOutcome = ("Expense was auto 
          approved for " + workflowProperties.InitiationData)
    End Sub 
    
    private void logToHistoryListActivity1_MethodInvoking(object sender, 
      EventArgs e)
    {
        this.logToHistoryListActivity1.HistoryOutcome = "Expense was 
          auto approved for " + workflowProperties.InitiationData;
    } 
    
  9. 按 F5 调试程序。

    这将编译应用程序,对其进行打包和部署,激活其功能,回收 IIS 应用程序池,然后启动位于**“Site Url”**属性中指定的位置的浏览器。

将工作流关联到文档列表

接下来,通过将工作流与 SharePoint 网站上的**“共享文档”**列表相关联来显示工作流关联窗体。

关联工作流

  1. 在快速启动栏上单击**“共享文档”**。

  2. 单击**“库工具”功能区选项卡上的“库”,然后单击“库设置”**功能区按钮。

  3. 在**“权限和管理”部分中,单击“工作流设置”链接,然后单击“工作流”页上的“添加工作流”**链接。

  4. 在工作流设置页中的顶部列表中,选择**“ExpenseReport - Workflow1”**模板。

  5. 在下一个字段中,键入 ExpenseReportWorkflow,然后单击**“下一步”**按钮。

    这会将工作流与**“共享文档”**列表相关联并显示工作流关联窗体。

  6. 在**“Auto Approval Limit”(自动审批限额)文本框中,键入 1200,然后单击“关联工作流”**按钮。

启动工作流

然后将工作流关联到**“共享文档”**列表中的某个文档以显示工作流启动窗体。

启动工作流

  1. 在 SharePoint 页上,单击**“主页”按钮,然后通过在快速启动栏上单击“共享文档”链接来显示 SharePoint 网站上的“共享文档”**列表。

  2. 通过单击页顶部的**“库工具”选项卡上的“文档”链接,并单击功能区上的“上载文档”按钮,将新文档上载到“共享文档”**列表中。

  3. 将鼠标指针指向已上载文档以显示下拉箭头。 单击下拉箭头并选择**“工作流”**。

  4. 单击 ExpenseReportWorkflow 旁边的图像。

    这将显示工作流启动窗体。 (请注意,**“Auto Approval Limit”(自动审批限额)**框中显示的值是只读的,因为此值是先前在关联窗体中输入的。)

  5. 在**“Expense Total”(费用总额)文本框中键入 1600,然后单击“启动工作流”**。

    这将再次显示**“共享文档”列表。 将带有“Completed”值的名为“ExpenseReportWorkflow”**的新列添加到工作流刚启动的项中。

  6. 单击已上载文档旁边的下拉箭头,然后单击**“工作流”以显示工作流状态页。 单击“已完成工作流”下的值“已完成”。 这将在“任务”**部分下方列出任务。

  7. 单击任务的标题以显示其任务详细信息。

  8. 返回到**“共享文档”**列表并使用同一文档或其他文档重新启动工作流。

  9. 在启动页上输入一个小于或等于关联页上输入的金额 (1200) 的金额。

    在执行此操作时,会在历史记录列表中创建一个项而不是任务。 该项显示在工作流状态页的**“工作流历史记录”部分中。 请注意历史记录事件的“结果”**列中的消息。 它包含 logToHistoryListActivity1.MethodInvoking 事件中输入的文本,该文本包括已自动审批的金额。

后续步骤

可从以下主题中了解有关如何创建工作流模板的更多信息:

请参见

任务

演练:向工作流中添加应用程序页

其他资源

创建 SharePoint 工作流解决方案