代码改变世界

使用VS进行工作流开发系列博客5-Developing Workflows in VS: Part 4 - Design and Bind Your Forms

2008-11-24 17:50  Virus-BeautyCode  阅读(891)  评论(0编辑  收藏  举报

原文地址:
http://blogs.msdn.com/sharepoint/archive/2006/11/26/developing-workflows-in-vs-part-4-design-and-bind-your-forms.aspx
第二步:设计并且绑定你的表单页面
有了你的工作流基本框架,你现在应该能够看出来你将从哪里收集数据和收集那些数据。有了这些信息,你能够创建自己的表单了,从收集到的数据建立一个概要,同时使用收集到的数据写工作流的后台代码。
后台的四种工作流表单页面
有四种类型的工作流表单页面你可以实现:关联,开始,编辑任务,编辑工作流。为了确定那一种是你需要的,你可以向自己提出下面的问题:
关联:我需要输入初始化的默认值吗,或者是工作流需要的值只有列表管理员可以设置吗?
开始:用户可以手动开始工作流吗?如果是这样,工作流开始需要什么信息呢?
任务:所有的用户都包括在我的工作流中吗?我将分配任务吗?
修改:在运行的过程中工作流需要调整吗?
如果你的答案是“是”的话,你将需要一个表单。
你所有的工作流表单将需要做下面的事情:
1、 从用户那里收集信息
2、 调用一个对象模型的功能去完成行为。例如,创建关联,开始工作流,编辑任务等)这个功能将数据作为参数同时传递给工作流。  (MOSS provides a shortcut for IP forms that we’ll talk about in a bit)
一旦这个功能被调用,sharepoint将触发一个在工作流日程中的事件,同时传递数据给他(除了关联,是发生在工作流日程之外的)。因此,工作流日程一定有一个相关的事件处理活动来响应这个事件。数据将会存储到一个变量,和那个活动的接受属性绑定。
例如,在下面的图中看到的,启动一个工作流,初始表单调用一个名为StartWorkflow的函数,这个函数把初始化数据字符串作为一个参数。函数触发工作流activated激活事件,触发OnWorkflowActivated活动(OnWorkflowActivated活动必须是你的工作流的第一个活动)。他存储初始化数据到变量中,并且绑定到活动的WorkflowProperties属性。后面的图展示了这个过程
1、 aspx页面调用StartWorkflow并且传递数据
2、 sharepoint填充数据给工作流的一个事件处理活动(OnWorkflowActivated)
 wf1.JPGwf2.JPG
任务列表和修改中也是类型的工作。下面是一个关于每一个表单类型调用的功能的图表,那些活动你需要接收事件,活动的那些属性负责填充数据。
 
表明需要使用那些表单页面
你已经有了你的表单页面,你需要标明在工作流的那些状态使用哪些表单,例如,关联使用那些表单,初始化使用那些表单等。这些将会在工作流模板文件(workflow.xml)中定义,我们将会在工作流部署步骤看到。下面是在表单和类型之间的一个一对一映射,例如
<Workflow
       Name=…
       TaskListContentTypeId="0x01080100C9C9515DE4E24001905074F980F93160"
       AssociationUrl="_layouts/CstWrkflIP.aspx"
       InstantiationUrl="_layouts/IniWrkflIP.aspx"
       ModificationUrl="_layouts/ModWrkflIP.aspx"> 
在上面的片段中,我们使用了来自MOSS宿主机(在下一章节我们将解释什么叫做宿主机页面)的几个开箱即用的页面。简短来说,如果你用宿主机页面,你将使用上面的描述,你也可以使用自己的aspx表单页面。
对任务列表来说,不光是一个详细页面了,你描述的是一个内容类型,可能的视图和编辑页面。通用的内容类型来自MOSS的宿主机表单。
问题回答:如何指定多任务或者交互表单
你只能为每一个表单类型指定一个aspx页面,和一个默认的任务类型。但是,你的工作流中的任务和交互可能不止需要一个表单。如果你你正在创建你自己的自定义页面,并且需要多余一个的任务编辑表单,你将为每一个任务类型创建一个内容类型,同时使用CreateTaskWithContentType活动(而不是CreateTask活动)来创建一个任务来使用那个内容内容类型。如果你需要更多的交互表单页面,创建一个页面转向多个多个表单,或者在页面参数和工作流模板之上创建一个页面包含多个视图。如果你使用InfoPath表单,MOSS开箱即用的aspx页面,将根据workflow模板文件中描述的元数据自动装载合适的表单。
InfoPath  vs.  ASPX Forms
现在我们知道在后面的表单需要知道发生了什么,因此我们只需要选择InfoPath(IP)或者ASPX 表单技术。
在现实中,所有你看见的以浏览器为基础的工作流表单都是aspx页面。使用InfoPath表单的不同点是他们都存在于MOSS提供的开箱即用页面中的XmlFormView 控件中。这些页面我们在workflow.xml文件的最后一个部分已经指定。
使用InfoPath表单有下面的若干有点供我们参考:
1、 他们可以直接在Office2007客户端程序使用
客户端程序((Word, Excel, PowerPoint, Outlook, InfoPath),像aspx页面,可以作为工作流的宿主InfoPath表单。因此当你单击outlook或者word中的“编辑这个任务”按钮的时候,InfoPath任务表单将直接在应用程序中出现一个对话狂来编辑任务。这个表单和你在浏览器中看到的是一样的,因此你一个很好的体验。如果你使用aspx页面,这个按钮将把你导向一个浏览器页面。
2、 使用InfoPath 设计器很容易设计表单
拖拽,表单规则向导。。。如果你喜欢在InfoPath中设计表单,这是一个加强版的。
3、 不需要代码
不需要代码?但是调用方法实现特殊的行为怎么办呢?很好,MOSS 的aspx页面将使用对象模型来调用,因此你需要的只是集中精神在设计器中设计表单。更详细的,1、装载InfoPath表单2、等待表单发送xml给自己3、执行对象模型的调用。如果开箱即用的功能不是你想要的,你可以在你自己的aspx页面编写代码去host你的InfoPath表单和调用合适的函数。但是记住,你可能同样需要在你的InfoPath表单后面写功能代码。
创建InfoPath表单
对于创建的每一个工作流表单,你都将需要下面的步骤:
1、 给字段取名
定义你的概要根据你想要以怎样的方式在工作流中引用你的数据。因此如果你有一个控件收集评论,并且取名叫做“comments”,在你的工作流代码中,你将可以通过“comments”来引用这个数据。
 2、
我们知道InfoPath表单是寄宿在一个aspx页面或者客户端程序中的,因此当用户想要提交表单的时候,要有一个提交按钮,1、创建一个链接去提交xml数据给宿主机(宿主机将会处理剩下的工作)然后,关闭表单,以便不止是提交和逗留在周围。
3、添加域信任
你需要为工作流表单做这些事情,在InfoPath中,在【工具】-【表单选项】-【安全和信任】
4、 发布到你的项目文件夹
在你部署你的工作流的时候,工作流表单将会被部署。因此保存他们在你的手边,以便部署工具打包他们并且你可以在必要的时候修改。不要忘了保留交替访问路径空白,否则将不能安装。
容易犯的错误:忘记清除交替访问路径Forgetting to clear the alternate access path
在发布的过程中很容易忘记清除交替访问路径,因为他在你指定发布路径的地方是默认的;确保激活并删除提供的默认值。
容易犯的错误:混淆InfoPath文档和InfoPath工作流表单
一个人们容易进入的陷阱就是认为工作流InfoPath表单和一个被存为xml文件的InfoPath文档是一样的。如果你正在为一个表单库设计工作流,应该想像库的表单模板就是一个普通的文档,工作流表单处理UI。工作流表单不是保存的文件,他们只是收集数据的UI,传递给工作流的是数据,而不是文件。
任务的第五步:itemMetadata.xml
如果你需要装载任务数据到你的任务表单而不是用代码,你需要一个额外的步骤.不像其他的工作流对象,任务是列表项的集合能被拧进表单和工作流不希望的方式中,例如,添加一个栏并且改变列表项的概念。为了补偿在任务数据和表单之间可能的架构不同,我们让开发者在任务中定义需要的字段,来装载表单控件,通过一个叫做ItemMetadata.xml的文件。
Sharepoin将任务作为一个xml传递到这个文件,应该是表单的第二个数据源。在这种情况下,他使用任务的精确架构。因此任务表单的第五步(在第四步之前做这些事)是:
添加一个ItemMetadata.xml文件作为你的表单的第二个数据源
文件内容将会包括下面的内容:
<z:row xmlns:z="#RowsetSchema"
 ows_instructions=""/>
“instructions”标记是sharepiont任务列表中的一个字段或者栏的名字。你可以选择ows_instructions作为你的字段的默认值。
绑定表单数据到你的工作流
就像我们早先看到的,表单页面调用激发工作流事件的函数,填充表单数据到相关活动的属性中。因此所有你需要做的是在时间激发的时候写一个处理分析数据并且使用数据在工作流中表现行为。
初始化表单数据会作为一个字符串传递给OnWorkflowActivated活动,因此不管他是通过序列化的类还是xml分析帮助函数,你只需要获取数据中你可以使用的字符串数据。交互同样是传递字符串给OnWorkflowModified活动,字符串同样是从初始化表单数据中解析。如果你使用InfoPath表单,“Submit to host”将表单数据作为一个xml字符串传递给主机,直接传递给调用函数,因此对于初始化和交互来说,都要解析表单的结构(例如,使用xsd生成工具为他创建一个类)。
任务在表单提交之后会有稍微的不同,数据被直接存入任务列表中。Sharepoint做了一点小的魔术在任务上,同时拷贝任务表单成为工作流的SPWorkflowTaskProperties对象,包含任务列表项自己改变的属性。对于InfoPath表单,宿主机解析的xml并且保存每一个字段到一个任务列表的同名栏。因此如果你有一个名为“AssignedTo”的表单域,他将会写值到任务列表项的“AssignedTo”属性。如果一个表单域在列表中没有匹配的栏,例如“foo”表单域,这个域将会保存为任务对象的一个隐藏字段。隐藏字段可以在工作流SPWorkflowTaskProperties对象的“EextendedPproperties”中,以一个hashtable形式存储,能被工作流引用,通过使用表单域的名字作为键来访问,例如:afterProps.ExtendedProperties[“foo”].
绑定对象数据到你的表单
这些表单从sharepoint对象中获取工作流的相关数据。例如,关联和初始化表单从列表或者内容类型的SPWorkflowAssociation对象加载初始化数据。
任务表单从ItemMetadata.xml文件中拉数据,交互从SPWorkflowModification对象的contextData字符串中拉数据;记住:这个对象如果改变,需要被工作流重新初始化。
下一章节:编码你的工作流