前天要做个让SPD在设计工作流的时候能添加的Activity .
场景是这样的,当流程走到某一步的时候,必须设置当前列表项的权限为部分人只读,部分人可修改,完了再走几步后恢复权限(先前没自定义权限,所以直接恢复继承就OK).
最后做完的效果应该是这样,在SPD里设计工作流时可以在”操作”里找到我们自定义的Activity.
下面两张图是我们的Activity被加到工作流里的界面.
那么,是怎么做到跟SPD集成的呢?其实很简单.
第一步,首先我们得先做好这个Activity.
建项目添加Activity之后.要添加两个引用
然后一堆的namespace.
然后一堆的DependencyProperty.
然后一堆的功能代码.
…
Activity的实现代码就不贴了,严重影响页面.^_^最下面有下载整个项目的连接
第二步,强签名程序集,因为我们要把它装到GAC.
签名过后Rebuild.把DLL拖到GAC里去.
第三步,修改站点对应的目录里的web.config文件,搜索到</authorizedTypes>在这行上面加入一行:
Assembly的值可以用Reflector来看程序集
第四步, 在服务器上注册我们的Activity
定位到路径C:\Program Files\Common Files\Microsoft Sharedweb server extensions\12\TEMPLATE\2052\Workflow
里面有个wss.actions,可以通过修改这个文件来注册我们的Activity
更推荐的做法是,参考wss.actions新建一个action后缀的文件如 custom.actions
也可以直接修改wss.actions 在actions 节里加上下面两段:
ClassName="ItemRole.SetRoleActivity"
Assembly="ItemRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=810fc8cb8b152837"
AppliesTo="all"
Category="Sample">
<RuleDesigner Sentence="将%1的权限设置为%2用户只读,%3可写">
<FieldBind Field="ListId,ListItem" Text="此列表" Id="1" DesignerType="ChooseListItem" />
<FieldBind Field="Reader" DesignerType="Person" Text="只读用户" Id="2"/>
<FieldBind Field="Editor" DesignerType="Person" Text="可写用户" Id="3"/>
</RuleDesigner>
<Parameters>
<Parameter Name="__Context" Type="Microsoft.SharePoint.WorkflowActions.WorkflowContext" Direction="In" />
<Parameter Name="ListId" Type="System.String, mscorlib" Direction="In" />
<Parameter Name="ListItem" Type="System.Int32, mscorlib" Direction="In" />
<Parameter Name="Reader" Type="System.Collections.ArrayList, mscorlib" Direction="In" />
<Parameter Name="Editor" Type="System.Collections.ArrayList, mscorlib" Direction="In" />
</Parameters>
</Action>
<Action Name="恢复列表项的权限继承"
ClassName="ItemRole.ResetRoleInheritanceActivity"
Assembly="ItemRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=810fc8cb8b152837"
AppliesTo="all"
Category="Sample">
<RuleDesigner Sentence="将%1 恢复为继承父权限">
<FieldBind Field="ListId,ListItem" Text="此列表" Id="1" DesignerType="ChooseListItem" />
</RuleDesigner>
<Parameters>
<Parameter Name="__Context" Type="Microsoft.SharePoint.WorkflowActions.WorkflowContext" Direction="In" />
<Parameter Name="ListId" Type="System.String, mscorlib" Direction="In" />
<Parameter Name="ListItem" Type="System.Int32, mscorlib" Direction="In" />
</Parameters>
</Action>
来解释一下上面的代码
Action 的Name很好理解,就是在SPD里显示的名字,
ClassName指定类名,
Assembly不用说了,
AppliesTo,应用的对象,all就是全部,还可以是list,doclib
Category,在SPD里显示时的分类名
RuleDesigner 定义了在SPD添加了Activity后显示的东西。
FieldBind里有两个重要的的属性,Field跟DesignerType
有好多个DesignerType可用,对应着不同的弹出框和不同的功能。比如这里用到的Person ChooseListItem分别是用来选择用户和列表项的。
至于别的DesignerType和功能,最好的查阅地方我觉得还是wss.actions,对应着SPD显示出来的效果和功能去wss.actions里查看用的哪个Type.都用到什么Field等等。
Parameters里的每一个parameter对应着RuleDesigner里的Field,里面的各个属性也不难理解。
其中有一个__Context很重要。传递工作流运行时的上下文用的。
//其实没什么可解释的,一看就明白的那种。
第五步,重启IIS.OK
现在用SPD在站点上创建工作流的时候就可以用到我们自己定制的Activity了.(Activity一样是可以调试的,附加到正确的w3wp里就可以了)
完整项目下载