SPAlert.Filter不工作

时间:2017-01-23 09:00:01

标签: sharepoint-2013

有人可以帮助Sharepoint 2013上的SPAlert过滤器吗?

如果我在SPAlert实例上设置了Filter属性,则尚未发送警报

SPAlert newAlert = user.Alerts.Add();

SPAlertTemplateCollection alertTemplates = new SPAlertTemplateCollection(
(SPWebService)(SPContext.Current.Site.WebApplication.Parent));

newAlert.AlertType = SPAlertType.List;
newAlert.List = list;
newAlert.Title = alertTitle;
newAlert.DeliveryChannels = SPAlertDeliveryChannels.Email;
newAlert.EventType = eventType;
newAlert.AlertFrequency = SPAlertFrequency.Immediate;
newAlert.AlertTemplate = alertTemplates[Constants.AlertTemplates.GenericListCustom];                            

var wsm = new WorkflowServicesManager(web);
var wss = wsm.GetWorkflowSubscriptionService();
var subscriptions = wss.EnumerateSubscriptionsByList(list.ID);
bool assotiationExist = false;
var guid = Constants.Workflows.ApprovalWF.Guid;
foreach (var subs in subscriptions)
{
    assotiationExist = subs.DefinitionId == guid;
        if (assotiationExist)
        {
               newAlert.Filter = "<Query><Eq><FieldRef Name=\"ApprovalStatus\"/><Value type=\"string\">Approved</Value></Eq></Query>";
        }
}                               

newAlert.Update(false);

2 个答案:

答案 0 :(得分:0)

  

如果我在SPAlert实例上设置了Filter属性,则尚未发送警报

你到底需要什么?

如果您只想更改过滤器(警报条件),您是否只是尝试:

newAlert.AlertType = SPAlertType.List;
newAlert.List = list;
newAlert.Title = alertTitle;
newAlert.DeliveryChannels = SPAlertDeliveryChannels.Email;
newAlert.EventType = eventType;
newAlert.AlertFrequency = SPAlertFrequency.Immediate;
newAlert.AlertTemplate = alertTemplates[Constants.AlertTemplates.GenericListCustom];
newAlert.Filter = "<Query><Eq><FieldRef Name=\"ApprovalStatus/New\"/><Value type=\"string\">Approved</Value></Eq></Query>";
newAlert.Update(false);

我刚刚在您的过滤器查询中添加了一个/ New。警报中的查询过滤器需要在您的字段中获得/ New或A / Old。

如果您的提醒仍然不起作用,则可能不是过滤器。

答案 1 :(得分:0)

问题在于newAlert.EventType = eventType。 eventType是SPEventType.Add。这是在Workflow将ApprovalStatus字段设置为«已批准»之后不发送警报的原因。

我修改了algourithm。现在eventType是SPEventType.Modify,我添加了新的字段“IsNewAlertSent”列表。当事件第一次触发时,我发送电子邮件并设置“IsNewAlertSent”字段

最终代码如下所示。

类UserAlertManager:

..
newAlert.EventType = (eventType == SPEventType.Add? SPEventType.Modify: eventType);
newAlert.AlertFrequency = SPAlertFrequency.Immediate;
newAlert.AlertTemplate = alertTemplates[Constants.AlertTemplates.GenericListCustom];
..
           if (assotiationExist)
           {
              newAlert.Filter = "<Query><Eq><FieldRef name=\"ApprovalStatus\"/><Value type=\"Text\">Approved</Value></Eq></Query>";
              newAlert.Properties.Add("grcustomalert", "1"); 

            }
..
newAlert.Update(false);

class GRCustomAlertHandler:

...
string subject = string.Empty;
string body = string.Empty;
bool grCustomAlert = Utils.IsSPAlertCustom(ahp.a);
if (ahp.eventData[0].eventType == (int)SPEventType.Modify && grCustomAlert)
{
             SPListItem item = list.GetItemById(ahp.eventData[0].itemId);
             var isNewAlertSentField = item.Fields.GetFieldByInternalName(Constants.Fields.IsNewAlertSent);
             if (isNewAlertSentField != null && (item[Constants.Fields.IsNewAlertSent] == null || !(bool)item[Constants.Fields.IsNewAlertSent]))
             {
                       ...                           
                        Utils.SendMail(web, new List<string> { ahp.headers["to"].ToString() }, subject, body);
                               item[Constants.Fields.IsNewAlertSent] = true;
                                using (new DisabledItemEventScope())
                                {
                                    item.SystemUpdate(false);
                                }
                }
}

...