前天要做个让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里就可以了)
完整项目下载