SharePoint事件接收器

时间:2016-12-12 17:41:35

标签: sharepoint sharepoint-2013

我在VS 2015上编写了一个简单的代码来处理ItemAdded EventReceiver但它不会按预期触发。

public void ProcessOneWayEvent(SPRemoteEventProperties properties)
{
  try
  {
    using (ClientContext clientContext = TokenHelper.CreateRemoteEventReceiverClientContext(properties))
    {
      if (clientContext != null)
      {
        switch (properties.EventType)
        {
          case (SPRemoteEventType.ItemAdded):
            clientContext.Load(clientContext.Web);
            clientContext.ExecuteQuery();
            List list = clientContext.Web.GetList("https://learn91.sharepoint.com/sites/Demo/Lists/List1");
            clientContext.Load(list);
            clientContext.ExecuteQuery();
            CamlQuery query = new CamlQuery();
            query.ViewXml = @"<OrderBy><FieldRef Name='ID' Ascending='FALSE'/></OrderBy>";
            ListItemCollection items = list.GetItems(query);
            clientContext.Load(items);
            clientContext.ExecuteQuery();
            foreach (ListItem item in items)
            {
                item["Description"] = "Updated After Event Trigger";
                clientContext.Load(item);
                clientContext.ExecuteQuery();
            }
            break;
        }
      }
    }
  }
  catch (Exception ex)
  {
      string ErrorMessage = ex.Message;
  }
}

任何人都可以帮助解决问题吗?先谢谢!!

1 个答案:

答案 0 :(得分:0)

好的,你应该考虑的事情很少。首先,我建议不要在列表中使用硬编码的网址,例如

List list = clientContext.Web.GetList("https://learn91.sharepoint.com/sites/Demo/Lists/List1");

而只是按名称加载

var list = clientContext.Web.Lists.GetByTitle("List1");

另一件事是你的Caml查询。如果你想让你的listItems排序(我不知道为什么,因为你正在更新所有项目)。您缺少<View><Query>个节点。你的caml应该看起来如下

var camlQuery = new CamlQuery {
   ViewXml = @"<View><Query><OrderBy><FieldRef Name='ID' Ascending='FALSE'/></OrderBy></Query></View>"
};

由于这是更新,因此您可能会遇到访问NonInitializedProperty的问题,因此请参阅

部分
ListItemCollection items = list.GetItems(query);
clientContext.Load(items);

还应包含描述属性,如下面的代码段

ListItemCollection items = list.GetItems(query);
clientContext.Load(items, listItems => listItems.Include(item => item["Description"]));

另一件事是你正在迭代这些项目,但你没有更新它们。此外,CSOM处理批处理,因此您不必在每次更改项目时调用ExecuteQuery。所以你的循环

foreach (ListItem item in items)
{
   item["Description"] = "Updated After Event Trigger";
   clientContext.Load(item);
   clientContext.ExecuteQuery();
}

应该看起来像那样:

foreach (var item in items)
{
    item["Description"] = "Updated After Event Trigger";
    item.Update();
}
clientContext.ExecuteQuery();

希望有所帮助。还请注意,上面的代码示例适用于少于5000项的列表。如果您违反了该限制,请阅读MSDN

上的ListItemCollectionPosition