2009-08-07 9 views
11

SharePointワークフローのカスタムアクティビティを作成していますが、現在のワークフローアイテム、SPWebまたはSPSiteの使用方法がわかりません。ワークフローアクティビティ(SharePoint)でコンテキストアイテムを取得する方法

私はhttp://blogs.microsoft.co.il/blogs/davidbi/archive/2008/07/21/How-to-get-the-context-item-in-workflow-activity-sharepoint.aspxを参照していますが、このソリューションのxmlルーチンはあまりにも悪いです。

おそらく、ワークフローアクティビティでコンテキストアイテムを取得するコード専用のソリューションがありますか?

+0

、ここで説明したように、私はすべてをした、そしてまだ私の状況があまりにも常にnullです。私はSequenceActivityに基づいてカスタムSPDesignerアクティビティをコーディングしています。さらに、Sharepoint DesignerでWFを編集しようとすると、エラーのため保存できません。 –

答えて

18

これに対する答えはカップルの手順です:

  1. はあなたの.ACTIONSでプロパティファイル(そうSPDがあなたにマッピングする方法を知っているあなたのカスタマイズされたアクティビティは.cs
  2. リンクにプロパティを追加します。ここでのコードは次のとおりです。プロパティ)
  3. は、あなたのコード内のプロパティ

STEP 1を使用しますプロパティ(私のクラスは、あなたのクラスであることを名前を変更する必要がありますGetEmailsという):

public static DependencyProperty __ContextProperty = System.Workflow.ComponentModel.DependencyProperty.Register("__Context", typeof(WorkflowContext), typeof(GetEmails)); 

[Description("The site context")] 
[Category("User")] 
[Browsable(true)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
public WorkflowContext __Context 
{ 
    get 
    { 
     return ((WorkflowContext)(base.GetValue(GetEmails.__ContextProperty))); 
    } 
    set 
    { 
     base.SetValue(GetEmails.__ContextProperty, value); 
    } 
} 

public static DependencyProperty __ListIdProperty = System.Workflow.ComponentModel.DependencyProperty.Register("__ListId", typeof(string), typeof(GetEmails)); 

[ValidationOption(ValidationOption.Required)] 
public string __ListId 
{ 
    get 
    { 
     return ((string)(base.GetValue(GetEmails.__ListIdProperty))); 
    } 
    set 
    { 
     base.SetValue(GetEmails.__ListIdProperty, value); 
    } 
} 

public static DependencyProperty __ListItemProperty = System.Workflow.ComponentModel.DependencyProperty.Register("__ListItem", typeof(int), typeof(GetEmails)); 

[ValidationOption(ValidationOption.Required)] 
public int __ListItem 
{ 
    get 
    { 
     return ((int)(base.GetValue(GetEmails.__ListItemProperty))); 
    } 
    set 
    { 
     base.SetValue(GetEmails.__ListItemProperty, value); 
    } 
} 

public static DependencyProperty __ActivationPropertiesProperty = DependencyProperty.Register("__ActivationProperties", typeof(Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties), typeof(GetEmails)); 

[ValidationOption(ValidationOption.Required)] 
public Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties __ActivationProperties 
{ 
    get 
    { 
     return (Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties)base.GetValue(GetEmails.__ActivationPropertiesProperty); 
    } 
    set 
    { 
     base.SetValue(GetEmails.__ActivationPropertiesProperty, value); 
    } 
} 

STEP 2:次に、あなたの.ACTIONSでファイルがブロックにこれらのプロパティのマッピングを追加するには、(注意します__ListID、__ListItem、__Context、及び__ActivationPropertiesのエントリ):

<Action Name="[DESCRIPTION OF YOUR ACTION]" 
    ClassName="[Your.Namespace.Goes.Here].GetEmails" 
    Assembly="[yourDLLName], Version=1.0.0.0, Culture=neutral, PublicKeyToken=0bfc6fa4c4aa913b" 
    AppliesTo="all" 
    Category="[Your Category Goes Here]"> 
    <RuleDesigner Sentence="[blah blah blah]"> 
    <FieldBind Field="PeopleFieldName" Text="people field" Id="1"/> 
    <FieldBind Field="Output" Text="emailAddress" Id="2" DesignerType="parameterNames" /> 
    </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="PeopleFieldName" Type="System.String, mscorlib" Direction="In" /> 
    <Parameter Name="Output" Type="System.String, mscorlib" Direction="Out" /> 
    <Parameter Name="__ActivationProperties" Type="Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties, Microsoft.SharePoint" Direction="Out" /> 
    </Parameters> 
</Action> 

STEP 3:ここ 機能を実行する例である:

protected override ActivityExecutionStatus Execute(ActivityExecutionContext provider) 
{ 
    Output = string.Empty; 

    try 
    { 
     SPWeb web = __Context.Web; 
     // get all of the information we currently have about the item 
     // that this workflow is running on 
     Guid listGuid = new Guid(__ListId); 
     SPList myList = web.Lists[listGuid]; 
     SPListItem myItem = myList.GetItemById(__ListItem); 

     //... 
    } 
    catch (Exception e) 
    { 
     //... 
    } 

    return ActivityExecutionStatus.Closed; 
} 
+0

ありがとう、このソリューションは私を助けた。 – avishnyakov

+0

優秀かつ徹底的な答え。ありがとう! –

+0

ありがとう! ActivationPropertiesはいつ必要ですか? – Serhiy

1

SPWorkflowActivationProperties.Item Property

を見ては、ワークフローインスタンスが実行されているリスト項目を取得します。

+1

私はSequenceActivityベースクラスから自分のアクティビティを実装しています。 ここで私はSPWorkflowActivationPropertiesインスタンスを見つけることができますか? – avishnyakov

2

キットメンケの答えは非常に包括的で、ちょうど約あなたが必要なすべてをカバー:私は次のように追加することになります...

あなたがこれを行う場合は、次の

SPWeb tmpweb = __Context.Web; 
SPSite site = new SPSite(tmpweb.Url); 
SPWeb web = site.OpenWeb(); 

の代わりに、この:

SPWeb web = __Context.Web; 
... 

あなたは、それをトリガーした人がワークフローに渡すセキュリティコンテキストを自由に使用できます。

1

私はこのコードを試しても、contex objetは常にnullですがバットで動作します。何人かは知っている?

protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) 
    { 


     //return base.Execute(executionContext); 
     int IdRetorno = -1; 



     try { 
      SPSecurity.RunWithElevatedPrivileges(delegate 
      { 
       LogExceptionToWorkflowHistory("Inicio:", executionContext, WorkflowInstanceId); 
       using (SPSite sitio = new SPSite(this.__Context.Site.ID)) 
       { 

        using (SPWeb web = sitio.AllWebs[this.__Context.Site.ID]) 
        { 


         SPList sourceList = web.Lists[new Guid(ListId)]; 
         LogExceptionToWorkflowHistory(ListId, executionContext, WorkflowInstanceId); 
         SPList destinoList = web.Lists[new Guid(SourceListId)]; 
         LogExceptionToWorkflowHistory(SourceListId, executionContext, WorkflowInstanceId); 
         SPListItem sourceItem = sourceList.Items.GetItemById(ListItem); 
         LogExceptionToWorkflowHistory(ListItem.ToString(), executionContext, WorkflowInstanceId); 

         SPListItem destinoItem = destinoList.Items.Add(); 
         CopyFieldValues(sourceItem, destinoItem); 
         destinoItem.SystemUpdate(); 

         sourceItem.Delete(); 
         IdRetorno = destinoItem.ID; 
        } 
       } 

      }); 

     } 
     catch (Exception ex) { 
      if (!System.Diagnostics.EventLog.SourceExists("MyApp1")) 
       System.Diagnostics.EventLog.CreateEventSource(
        "MyApp1", "Application"); 

      EventLog EventLog1 = new EventLog(); 
      EventLog1.Source = "MyApp1"; 
      EventLog1.WriteEntry(ex.Message,EventLogEntryType.FailureAudit); 

      LogExceptionToWorkflowHistory(ex.Message, executionContext, WorkflowInstanceId); 
     } 


     OutListItemID = IdRetorno; 




     return base.Execute(executionContext); 

    } 

おかげ

+0

RunWithElevatedPrivileges内にラップされているためですブロック。私はあなたがサイトのIDを別の方法で渡さなければならないと思いますか? –

1

、これはあまりにも簡単であるかどうかは知らないが、私が使用:

objCurrentItem = workflowProperties.Item 

ワークフロー(リスト)内のアイテムを取得するために、次に変更しますリスト内のアイテム

3

これは2010 APIの変更であるかどうかはわかりませんが、__Contextプロパティはリストとアイテムを含むすべての必要な部分を提供しています。以下の例では、セキュリティコンテキストを破棄するためのdavekの提案@含まれています

  var contextWeb = __Context.Web; 
      var site = new SPSite(contextWeb.Url); 
      var web = site.OpenWeb(); 

      var list = web.Lists[new Guid(__Context.ListId)]; 
      var item = list.GetItemById(__Context.ItemId); 
関連する問題