如何:访问工作流中的关联和初始表单数据

上次修改时间: 2010年5月7日

适用范围: SharePoint Server 2010

工作流实例启动时,从用户收集的任何关联和初始数据都存储在 SPWorkflowActivationProperties 对象中,可以通过 OnWorkflowActivated 活动的 WorkflowProperties 属性访问此对象。此对象包含每个工作流的标准信息,以及来自工作流定义 XML 或来自工作流关联和初始表单的自定义数据。通过访问为 WorkflowProperties 属性指定的 SPWorkflowActivationProperties 对象变量,可以使用传递至工作流的信息。

SPWorkflowActivationProperties 对象包含 SharePoint Foundation 中每个工作流实例的一组标准属性,其中包括 HistoryListIdItemIdTaskListIdWorkflowId

此外,该对象还包含由 AssociationDataInitiationData 属性表示的字符串,这两个属性分别存储工作流关联和初始的自定义属性。

对于 Microsoft Office InfoPath 表单,这些属性返回一些 XML 字符串,这些字符串符合用于收集数据的表单的架构。若要访问这些自定义属性,必须编写用于分析 XML 字符串的代码。

工作流开发人员可以决定使用何种方法来分析 XML 字符串,并识别其中包含的自定义属性。对于此过程,我们将使用 Visual Studio 命令行工具 xsd.exe,基于工作流表单的架构生成一个类;然后,通过对 SPWorkflowActivationProperties 对象的 InitiationData 属性所返回的 XML 字符串进行反序列化,将传入的表单数据存储到该类型的对象中。

有关设置活动属性的详细信息,请参阅 Windows Workflow Foundation SDK。

访问工作流中的关联或初始表单数据

  1. 提取 InfoPath 关联或初始表单的架构。

    1. 在 InfoPath 中打开已保存和发布的工作流表单。

    2. 若要将表单保存为源文件,请在"文件"菜单上单击"另存为源文件"。浏览到要保存表单源文件的位置,然后单击"确定"。

      InfoPath 会将表单源文件集合(包括架构文件)保存到指定位置。表单架构文件始终命名为 myschema.xsd。

  2. 使用命令行工具 xsd.exe 根据表单架构文件 (.xsd) 生成新的类文件。

    1. 打开 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

    2. 导航到表单架构 (.xsd) 文件的位置,然后运行以下命令:xsd myschema.xsd /c /o:output_directory

      xsd.exe 工具根据表单架构生成新的类文件。文件的名称与架构文件 myschema.cs 相同。文件中类的名称与架构的根元素相同,而根元素的名称又与表单字段集合相同。

      备注

      请为表单字段集合指定唯一的名称,而不要使用默认名称 myfields,这样有助于确保从表单架构文件生成的类也有唯一的名称。对使用多个表单的工作流进行编程时这一点尤为重要。

  3. 在 Visual Studio 中打开工作流项目,然后向其添加这个新的类文件。

  4. 向工作流添加代码,此代码通过使用工作流关联或初始数据对新类的新实例进行序列化。

    例如,以下代码从名为 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)
    
  5. 向工作流添加代码,此代码根据表单架构将自定义属性作为类属性进行访问。

    下面的代码以前一个示例为基础。这些代码访问 InitForm 对象的三个自定义属性,并将这些属性赋给字符串变量。

      assignee = initform.assignee;
      instructions = initform.instructions;
      comments = initform.comments;
    
    assignee = initform.assignee
    instructions = initform.instructions
    comments = initform.comments
    

请参阅

任务

如何:设计 InfoPath 工作流表单

如何:设计使用关联和初始数据的工作流表单

概念

工作流的 InfoPath 表单

工作流关联和初始表单 (Microsoft SharePoint Server 2010)