完全可以在自定义Activity中通过WorkflowContext上下文获取到当前项或当前SPWeb等信息。除非你要获取其他Site的数据,否则就没必要用去把Site Url、List Guid或ListItem ID等这些数据信息作为输入参数让工作流定制人员来手工输入以获取相关对象。
下面为一个代码模板(LiveWriter不支持代码色彩,就看黑白的代码吧):
publicclassMyActivity: Activity
{
#regionProperties
publicstaticDependencyProperty __ContextProperty =DependencyProperty.Register("__Context", typeof(WorkflowContext), typeof(MyActivity));
[ValidationOption(ValidationOption.Required)]
publicWorkflowContext __Context
{
get
{
return(WorkflowContext)base.GetValue(__ContextProperty);
}
set
{
base.SetValue(__ContextProperty, value);
}
}
publicstaticDependencyProperty ListItemProperty =DependencyProperty.Register("ListItem", typeof(int), typeof(MyActivity));
[ValidationOption(ValidationOption.Required)]
publicintListItem
{
get
{
return(int)base.GetValue(ListItemProperty);
}
set
{
base.SetValue(ListItemProperty, value);
}
}
publicstaticDependencyProperty ListIdProperty =DependencyProperty.Register("ListId", typeof(string), typeof(MyActivity));
[ValidationOption(ValidationOption.Required)]
publicstringListId
{
get
{
return(string)base.GetValue(ListIdProperty);
}
set
{
base.SetValue(ListIdProperty, value);
}
}
#endregion
protectedoverrideActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
Guid listGuid =Helper.GetListGuid(__Context, ListId);
SPList list =__Context.Web.Lists[listGuid];
SPListItem item =__Context.GetListItem(list, ListItem);
//做自己的事 :)
returnActivityExecutionStatus.Closed;
}
其对应在 WSS.ACTIONS 中的节点配置如下:
ClassName="TestActivities.MyActivity"
Assembly="TestActivities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dd27a7cb343a4cac"
AppliesTo="list"
Category="我的自定义操作"> ClassName="TestActivities.MyActivity"
Assembly="TestActivities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dd27a7cb343a4cac"
AppliesTo="list"
Category="我的自定义操作">
几点说明:
AppliesTo="list" 表示应用到列表,还可以有 AppliesTo="all" 表示应用到包括列表在内的所有sharepoint库表。Category="我的自定义操作",就表示你在 SPD 2007中看到的 Actions 的分类。Action 内属性还有 ListModeration="true" 表示是否要显示未经审核的项,UsesCurrentItem="true" 表示直接使用当前项。
DesignerType="ChooseDoclibItem" 表示点“此列表”后弹出选择对话框(ChooseDoclibItem限文档库,列表可用ChooseListItem),以选择参数 ListId 和 ListItem。DesignerType表示SPD 2007支持的各种类型,如整数Integer、字符串String,电子邮件Email(含Email关键参数,类似Field="To,CC,Subject,Body"),单个人员SinglePerson,多个人员Person,参数类型ParameterNames,待更新项类型UpdateListItem(类似Field="ListId,ListItem,ItemProperties"),还有一个我们第一个问题用的“向用户收集数据”用到的类型Survey。SPD 2007设计器都支持这些类型的直接设计,因为也才体现出其强大之处(当然也有不足,如不支持InfoPath,不支持调试,不支持StateMachine等)。
Id="1" 表示对应 Sentence 中的 %1。比如上面效果,你在SPD 2007将看到显示为“输出 此列表 到数据库”,点此列表后,将弹出让你选择你要的项。 下面Parameters节点里就比较好理解了,只要注意 Direction 有 In 和 Out 作为输入参数和输出参数即可。
具体的部署可以对照如下的链接的文章:
http://www.cnblogs.com/wayne-ivan/archive/2007/09/15/894188.html
关于WorkflowContext Class
http://msdn2.microsoft.com/en-s/library/microsoft.sharepoint.workflowactions.workflowcontext.aspx
关于如何读出表单的xml文件请参阅
在InfoPath表单内提交表单并启动工作流