2017-01-23 76 views
1

任何人都可以在Sharepoint 2013上使用SPAlert过滤器吗?SPAlert.Filter无法正常工作

如果我设置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); 

回答

0

问题出现在newAlert.EventType = eventType行中。 eventType是SPEventType.Add。这是工作流程将ApprovalStatus字段设置为«Approved»后不发送警报的原因。

我修改了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); 

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

... 
0

如果我设置Filter属性上SPAlert实例的警报尚未发送

你这是什么需要准确吗?

如果你只是想改变滤波器(警戒状态),你只需尝试:

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或/ Old。

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