2009-08-07 16 views
11

estoy escribiendo actividad personalizada de flujo de trabajo de SharePoint y no sé cómo puedo usar elemento del flujo de trabajo actual, SPWeb o SPSite.cómo sacar el elemento de contexto en la actividad de flujo de trabajo (SharePoint)

veo http://blogs.microsoft.co.il/blogs/davidbi/archive/2008/07/21/How-to-get-the-context-item-in-workflow-activity-sharepoint.aspx pero xml rutinas de esta solución es demasiado malo para mí.

Quizás haya otra solución de solo código para obtener el elemento de contexto en la actividad de Workflow?

+0

Hice todo lo que se describe aquí, pero mi contexto siempre es nulo. Estoy codificando una Actividad SPDesigner personalizada basada en SequenceActivity. Aún más, cuando intento editar el WF en Sharepoint Designer, no puedo guardarlo debido a un error. –

Respuesta

18

La respuesta a esto es un par de pasos:

  1. Agregue las propiedades a su actividad personalizada de Cs
  2. Enlace las propiedades en el archivo de .actions (de modo SPD sabe cómo asignar a su propiedades)
  3. utilizar las propiedades en el código

PASO 1: Aquí está el código de las propiedades (mi clase se denomina GetEmails que tendrá que cambiar el nombre para que sea su clase):

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); 
    } 
} 

PASO 2: Luego, en sus .actions FICHA añadir a su bloque de las asignaciones de esas propiedades (tenga en cuenta el entradas para __ListID, __ListItem, __Context, y __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> 

PASO 3:

: Aquí hay un ejemplo de función ejecutan
+0

Gracias, esta solución me ayudó. – avishnyakov

+0

Respuesta excelente y completa. ¡Gracias! –

+0

¡Gracias! ¿Y cuándo necesitamos ActivationProperties? – Serhiy

1

Tome un vistazo a la SPWorkflowActivationProperties.Item Property

Obtiene el elemento de la lista en la que se ejecuta la instancia de flujo de trabajo.

+1

Hm .. Implemento mi propia actividad desde la clase base SequenceActivity. ¿Dónde puedo encontrar la instancia SPWorkflowActivationProperties en este caso? – avishnyakov

2

Kit de respuesta de Menke es muy amplio y abarca casi todo lo que necesita: Sólo añadiría lo siguiente ...

Si hace esto:

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

en lugar de esto:

SPWeb web = __Context.Web; 
... 

, entonces está libre del contexto de seguridad que la persona que lo activó transfirió al flujo de trabajo.

1

Intento este código y también funciona igual que el objeto de contexto siempre es nulo. alguien sabe por qué?

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); 

    } 

gracias

+0

Supongo que está dentro de RunWithElevatedPrivileges bloquear. Creo que tendrías que pasar la identificación del sitio de otra manera? –

1

No sé si esto es demasiado fácil, pero he usado:

objCurrentItem = workflowProperties.Item 

para conseguir el artículo dentro del flujo de trabajo (una lista) y luego a alterar los elementos en la lista

3

No estoy seguro de si esto es un cambio en la API 2010, pero la propiedad __Context proporciona todas las piezas necesarias, incluida la lista y el elemento. El ejemplo a continuación incluye la sugerencia de @ davek para descartar el contexto de seguridad:

  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); 
Cuestiones relacionadas