如何:访问工作流中的关联和初始表单数据
上次修改时间: 2010年5月7日
适用范围: SharePoint Server 2010
工作流实例启动时,从用户收集的任何关联和初始数据都存储在 SPWorkflowActivationProperties 对象中,可以通过 OnWorkflowActivated 活动的 WorkflowProperties 属性访问此对象。此对象包含每个工作流的标准信息,以及来自工作流定义 XML 或来自工作流关联和初始表单的自定义数据。通过访问为 WorkflowProperties 属性指定的 SPWorkflowActivationProperties 对象变量,可以使用传递至工作流的信息。
SPWorkflowActivationProperties 对象包含 SharePoint Foundation 中每个工作流实例的一组标准属性,其中包括 HistoryListId、ItemId、TaskListId 和 WorkflowId。
此外,该对象还包含由 AssociationData 和 InitiationData 属性表示的字符串,这两个属性分别存储工作流关联和初始的自定义属性。
对于 Microsoft Office InfoPath 表单,这些属性返回一些 XML 字符串,这些字符串符合用于收集数据的表单的架构。若要访问这些自定义属性,必须编写用于分析 XML 字符串的代码。
工作流开发人员可以决定使用何种方法来分析 XML 字符串,并识别其中包含的自定义属性。对于此过程,我们将使用 Visual Studio 命令行工具 xsd.exe,基于工作流表单的架构生成一个类;然后,通过对 SPWorkflowActivationProperties 对象的 InitiationData 属性所返回的 XML 字符串进行反序列化,将传入的表单数据存储到该类型的对象中。
有关设置活动属性的详细信息,请参阅 Windows Workflow Foundation SDK。
访问工作流中的关联或初始表单数据
提取 InfoPath 关联或初始表单的架构。
在 InfoPath 中打开已保存和发布的工作流表单。
若要将表单保存为源文件,请在"文件"菜单上单击"另存为源文件"。浏览到要保存表单源文件的位置,然后单击"确定"。
InfoPath 会将表单源文件集合(包括架构文件)保存到指定位置。表单架构文件始终命名为 myschema.xsd。
使用命令行工具 xsd.exe 根据表单架构文件 (.xsd) 生成新的类文件。
打开 Visual Studio 命令提示符。单击"开始",依次指向"所有程序"、"Microsoft Visual Studio 2010"和"Visual Studio 工具",然后单击"Visual Studio 2010 命令提示符"。
备注
默认情况下,Visual Studio 2010 将 xsd.exe 命令行工具安装到以下位置(其中 C: 表示安装 Visual Studio 2010 的驱动器):C:\Program Files\Microsoft Visual Studio 10\SDK\v2.0\Bin
导航到表单架构 (.xsd) 文件的位置,然后运行以下命令:xsd myschema.xsd /c /o:output_directory
xsd.exe 工具根据表单架构生成新的类文件。文件的名称与架构文件 myschema.cs 相同。文件中类的名称与架构的根元素相同,而根元素的名称又与表单字段集合相同。
备注
请为表单字段集合指定唯一的名称,而不要使用默认名称 myfields,这样有助于确保从表单架构文件生成的类也有唯一的名称。对使用多个表单的工作流进行编程时这一点尤为重要。
在 Visual Studio 中打开工作流项目,然后向其添加这个新的类文件。
向工作流添加代码,此代码通过使用工作流关联或初始数据对新类的新实例进行序列化。
例如,以下代码从名为 workflowProps 的 SPWorkflowActivationProperties 对象变量的 InitiationData 属性中对 InitForm 类型的新对象进行序列化。此示例假定开发人员已创建一个类 InitForms,其架构与用于收集初始数据的 InfoPath 表单的架构相匹配。
using System.Xml.Serialization; using System.Xml; … XmlSerializer serializer = new XmlSerializer(typeof(InitForm)); XmlTextReader reader = new XmlTextReader(new System.IO.StringReader(workflowProps.InitiationData)); InitForm initform = (InitForm) serializer.Deserialize(reader);
Imports System.Xml.Serialization Imports System.Xml … Dim serializer As New XmlSerializer(GetType(InitForm)) Dim reader As New XmlTextReader(New System.IO.StringReader(workflowProps.InitiationData)) Dim initform As InitForm = CType(serializer.Deserialize(reader), InitForm)
向工作流添加代码,此代码根据表单架构将自定义属性作为类属性进行访问。
下面的代码以前一个示例为基础。这些代码访问 InitForm 对象的三个自定义属性,并将这些属性赋给字符串变量。
assignee = initform.assignee; instructions = initform.instructions; comments = initform.comments;
assignee = initform.assignee instructions = initform.instructions comments = initform.comments