Как получить контекст из обработчика событий рабочего процесса в Sharepoint 2010 - PullRequest
2 голосов
/ 03 мая 2011

Я нахожусь в процессе обновления наших пользовательских решений до Sharepoint 2010. Я хотел использовать обработчик событий WorkflowCompleted , но я не могу получить соответствующий SPListItem из свойств события.

Я пытался использовать SPWorkflowEventProperties.ActivationProperties , но это всегда возвращает ноль (даже в обработчике события WorkflowStarted ).

Как получить контекст из обработчиков событий рабочего процесса ( SPListItem , SPWeb , SPSite и т. Д.)?

Ответы [ 3 ]

2 голосов
/ 04 мая 2011

Я нашел то же самое.SPWorkflowEventProperties практически бесполезен, поскольку практически все равно нулю.Это не говорит о статусе (Утверждено, Отклонено и т. Д.).И, самое главное, он не (прямо) говорит, какой элемент был завершен.Надеюсь, это будет решено в следующих версиях.Тем временем я использовал следующее:

public override void WorkflowCompleted(SPWorkflowEventProperties properties)
{
   using (SPSite site = new SPSite(properties.WebUrl))
   {
       using (SPWeb web = site.OpenWeb())
       {
           SPListItem task = GetApprovedTask(properties, web);
           SPListItem item = GetApprovedItem(web, task);
           if (null != item)
           {
               // TODO : process approved item
           }
       }
   }
}

private SPListItem GetApprovedItem(SPWeb web, SPListItem task)
{
   SPListItem item = null;
   if (null != task)
   {
       SPList list = web.Lists[new Guid(task[SPBuiltInFieldId.WorkflowListId].ToString())];
       item = list.GetItemById((int)task[SPBuiltInFieldId.WorkflowItemId]);
   }
   return item;
}

private SPListItem GetApprovedTask(SPWorkflowEventProperties properties, SPWeb web)
{
   SPListItem item = null;
   string caml = @"<Where><And><And><And><Eq><FieldRef Name='WorkflowOutcome' /><Value Type='Text'>Approved</Value></Eq><Eq><FieldRef Name='WorkflowInstanceID' /><Value Type='Guid'>{0}</Value></Eq></And><IsNotNull><FieldRef Name='WorkflowListId' /></IsNotNull></And><IsNotNull><FieldRef Name='WorkflowItemId' /></IsNotNull></And></Where>";
   SPQuery query = new SPQuery();
   query.Query = string.Format(caml, properties.InstanceId);
   query.RowLimit = 1;
   SPList list = web.Lists["Tasks"];
   SPListItemCollection items = list.GetItems(query);
   if (items.Count > 0)
   {
       item = items[0];
   }
   return item;
}
1 голос
/ 17 сентября 2011

Вы можете использовать свойство InstanceId для извлечения SPListItem из списка задач рабочего процесса, как показано в этом сообщении

http://blog.symprogress.com/2011/09/sp-2010-get-workflow-status-workflowcompleted-event/

0 голосов
/ 04 мая 2011

Если вы можете быть более щедрым с деталями, я могу быть более конкретным с ответом.

Но это, как правило, то, что вам нужно сделать:

  1. Задать специфичные для контекста свойства

    public static DependencyProperty _ ContextProperty = System.Workflow.ComponentModel.DependencyProperty.Register (" _Context", typeof (WorkflowContext), typeof (MyCustomActivity));

[Описание ("Контекст сайта")] [Категория ("Пользователь ")] [Browsable (true)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Visible)] *

public WorkflowContext __Context
{
    get
    {
        return ((WorkflowContext)(base.GetValue(MyCustomActivity.__ContextProperty)));
    }

    set
    {
        base.SetValue(MyCustomActivity.__ContextProperty, value);
    }
}

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

[ValidationOption (ValidationOption.Required)] * ​​1018 *

public string __ListId
{
    get
    {
        return ((string)(base.GetValue(MyCustomActivity.__ListIdProperty)));
    }

    set
    {
        base.SetValue(MyCustomActivity.__ListIdProperty, value);
    }
}

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

[ValidationOption (ValidationOption.Required))]

public int __ListItem
{
    get
    {
        return ((int)(base.GetValue(MyCustomActivity.__ListItemProperty)));
    }

    set
    {
        base.SetValue(MyCustomActivity.__ListItemProperty, value);
    }
}

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

[ValidationOption (ValidationOption.Required)] * ​​1024 *

public Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties __ActivationProperties
{
    get
    {
        return (Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties)base.GetValue(MyCustomActivity.__ActivationPropertiesProperty);
    }

    set
    {
        base.SetValue(MyCustomActivity.__ActivationPropertiesProperty, value);
    }
}
  1. Вы получите контекст в __Context и все остальное от __Context какthis:

    защищенное переопределение ActivityExecutionStatus Execute (ActivityExecutionContext executeContext) {// Возбудить событие Invoke для выполнения пользовательского кода в рабочем процессе.this.RaiseEvent (MyCustomActivity.InvokeEvent, this, EventArgs.Empty);

    SPWeb _cxtWeb = null;
    String _strLinfo = "Dll;";
    String _strTo = String.Empty;
    
    // Set Context
    try
    {
        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            using (_cxtWeb = __Context.Web)
            {
                //_cxtWeb = __Context.Web;
                Guid _cListId = new Guid(__ListId);
                SPList _cSPList = _cxtWeb.Lists[_cListId]; // TimeLog
                SPListItem _cListItem = _cSPList.GetItemById(__ListItem);
                SMTPSERVER = _cxtWeb.Site.WebApplication
                                            .OutboundMailServiceInstance.Server.Address;
            }
        });
    }
    catch { /**/ }
    

    }

...