使用 Visual Studio 在 SharePoint 2013 中创建工作流





4.00/5 (1投票)
使用 Visual Studio 在 SharePoint 2013 中创建工作流
SharePoint 2013 工作流体系结构 引入了工作流管理器场。工作流管理器使用 REST API 与 SharePoint 2013 进行通信。工作流管理器要求用户配置文件应用程序已创建并配置好。
请继续阅读以了解 SharePoint 2013 中的工作流。我们将通过一个为联系人列表创建工作流的示例,该工作流将创建一个任务来将联系人分类为开发人员、团队负责人或经理,而不是任务表单中的默认“批准”和“拒绝”选项。
使用 SharePoint 管理器创建的 SharePoint 2013 工作流仅支持声明式工作流。我们无法嵌入像 SharePoint 2010 风格工作流那样的代码。要添加自定义业务逻辑,我们可以使用 HttpSend 活动并进行 Web 服务调用来处理业务逻辑。
序列
当我们在 Visual Studio 中创建工作流时,会创建一个默认的空序列。序列是活动的容器。我们可以通过从工具栏拖放活动来在序列中添加活动。
我们可以通过单击名称来重命名序列。重命名序列是个好主意,因为我们可以在序列内添加序列。而且,如果我们双击子序列,它将在设计窗口中仅显示子序列。
这样我们就可以只专注于我们正在处理的特定序列。顶部会有面包屑导航来返回父序列。因此,重命名序列对于在嵌套序列之间导航非常有帮助。
变量和参数
在设计器的底部,您会看到一个选项卡,可以在其中添加变量。这些变量可用于在工作流中传递值。您可以为变量指定一个作用域,该作用域设置为特定序列。如果作用域设置为根序列,那么子序列也可以使用它。
还有一个选项卡,可以在其中添加参数。参数用于向活动输入和输出值。
工作流任务和结果
SharePoint 2013 中的工作流任务列表使用一种不同的任务内容类型,称为“工作流任务 (SharePoint 2013)”。它继承自标准的“任务”内容类型。此内容类型添加了两个附加列。其中一列存储工作流实例 ID,另一列存储工作流的结果。
如果您想添加其他字段或创建自定义结果,您需要创建一个派生自“工作流任务 (SharePoint 2013)”内容类型的新内容类型,进行所需的更改,然后将其附加到工作流任务列表。
任务的结果由一个名为 TaskOutcome
的列管理,该列的类型为 OutcomeChoice
(继承自 Choice
)。此列具有 Approved
、Rejected
等选项,这些选项会显示在任务表单上。
如果您想创建自定义结果,您需要创建一个类型为 OutcomeChoice
的自定义列,并将其包含在您的自定义内容类型中。此外,您需要删除开箱即用的 TaskOutcome
列。不过,这有点棘手。我们将在示例中进行演示。
演练
让我们通过一个示例来详细了解这些概念。假设我们需要一个联系人列表,该列表需要被分类为开发人员、团队负责人或经理。因此,我们将附加一个工作流,该工作流将任务分配给人力资源部,并向其发送电子邮件。人力资源部将在任务表单中选择相应的角色。
首先,让我们创建一个新项目
在 Visual Studio 中创建一个SharePoint 托管的应用项目。
创建一个列表
右键单击项目并添加一个“联系人”列表。
在“联系人”列表设计窗口中,添加一个“人力资源”列,类型为“人员或组”,并将其设置为必填。
创建自定义结果列
现在,让我们创建一个自定义结果列来存储所需的选项。右键单击项目并添加一个站点列。我们称之为 RoleOutcome
。在 elements.xml 文件中,将类型更改为 OutcomeChoice
。并添加所需的选项。在我们的例子中,是“开发人员”、“团队负责人”和“经理”。
创建内容类型并向其添加自定义结果列
接下来,创建一个派生自“工作流任务(SharePoint 2013)”的内容类型。我们称之为 RoleAssignTaskCT
。
将我们的自定义结果列 RoleOutcome
添加到此内容类型。
添加工作流
现在向项目添加一个列表工作流。选择创建新工作流历史记录和任务列表的选项。
单击“下一步”。您可以选择“项目创建时自动启动工作流”选项。单击“完成”。
系统将创建一个工作流任务列表。转到该列表的 elements.xml 文件,复制现有的 ContentTypeBinding
标签,并将 ContentTypeId
替换为自定义结果内容类型 RoleAssignTaskCT
的 ID。
添加序列
在工作流设计器表面,会有一个序列。通过拖放“控制流”部分中的“序列”活动来添加两个子序列。将序列重命名为“获取联系人详细信息”和“分配任务”。
创建变量
添加一个名为 ContactDetails
的变量。在此变量的类型下拉列表中,选择“浏览类型”并选择 DynamicValue
(您可以在顶部的类型名称文本框中搜索它)。当我们查找列表项时,该活动将以 DynamicValue
的形式返回数据。
添加和配置活动
在“获取联系人详细信息”序列中,拖放一个 LookupSPListItem
活动,该活动位于“SP - 列表”部分。在此活动的属性窗口中,将 ListId
选择为(当前列表),将 ItemId
选择为(当前项)。
并将 Result
选择为上面创建的 DynamicValue
变量 – ContactDetails
。
现在,我们需要从 DynamicValue
类型中检索各个值。在“获取联系人详细信息”序列中,在 LookupSPListItem
活动下方添加一个 GetDynamicValueProperties
活动。在属性中将 DynamicValue
变量选为 Source
。
单击属性窗口中“(Dictionary)”旁边的“...”按钮。将实体类型选为“联系人的列表项”。在“Path”部分,选择您需要的列。在这种情况下,您可以选择“名字”、“姓氏”和“人力资源”。然后,单击“填充变量”。这将创建所需的用于从 Dynamic Value 填充的工作流变量。
确保“人力资源”变量的作用域设置为父级,因为我们将在“分配任务”序列中使用它。
分配任务
在“分配任务”序列中,拖放一个 SingleTask
活动。单击此活动上的“配置”链接。
在结果选项中,选择自定义任务内容类型 – RoleAssignTaskCT
,结果字段 – RoleOutcome
和默认结果。
在 SingleTask
活动下方拖放一个 WriteToHistory
活动。将消息设置为 “任务结果是 ” + outcome_0
。
outcome_0
是人力资源在任务中选择后生成的结果。
从任务表单中删除默认的批准和拒绝选项
现在,即使我们选择了自定义任务内容类型,在任务编辑表单中,它仍将同时显示开箱即用的字段和我们的自定义结果。这是因为父内容类型中存在我们继承的开箱即用的字段。我尝试使用 RemoveFieldRef
删除字段,但它不允许我修改,因为它是一个开箱即用的内容类型。
因此,我们将从自定义内容类型 ID 中删除父 ID 部分(应该是 3365C4474CAE8C42BCE396314E88E51F
)。
如果您的生成的内容类型 ID 是 0x0108003365C4474CAE8C42BCE396314E88E51F00983676A53ED54E5787C8F2E381A04271
,请删除父 ID 部分 3365C4474CAE8C42BCE396314E88E51F
。
因此,它将变成 0x010800983676A53ED54E5787C8F2E381A04271
。
现在,我们需要在工作流列表内容类型绑定和工作流 XML 代码中更新此新 ID(右键单击 workflow.xaml 并选择“查看代码”或按 F7)。将 ContentTypeId
的所有出现替换为更新后的 ID。
与其这样做,您可能会想到我们可以直接继承自“任务”内容类型而不是“工作流任务(SharePoint 2013)”,但问题是我们无法从 SingleTask
活动中选择它。Visual Studio 仅显示特定类型的内容类型。可以通过编辑工作流的 XML 来实现此目的,但我尚未尝试过。
部署和测试
部署解决方案。
由于这是一个 SharePoint 托管的应用,您将没有导航或站点内容链接。因此,您需要手动导航到 URL。为此,请导航到应用并删除“/Pages”及其之后的所有内容,然后插入“/lists/contacts”(针对联系人列表)或您为列表实例提供的任何 URL。您可以使用“/lists/WorkflowHistoryList”导航到工作流历史记录列表,使用“/Lists/WorkflowTaskList”导航到工作流任务列表。
创建一个新的联系人并分配人力资源字段。一旦人力资源通过选择联系人角色完成任务,工作流就应该完成。我们应该能够在工作流历史记录列表中看到记录的角色。
结论
我们可以将其扩展为更新联系人项,例如添加一个角色字段。或者,根据需求添加其他业务逻辑。
我们了解了使用 Visual Studio 在 SharePoint 2013 中创建工作流的概念。并且,我们通过示例演示了为 SharePoint 2013 创建 Visual Studio 工作流。
这篇文章 使用 Visual Studio 在 SharePoint 2013 中创建工作流 最先出现在 The SharePoint Guide。