【问题标题】:SharePoint Event ReceiverSharePoint 事件接​​收器
【发布时间】:2016-12-14 04:12:12
【问题描述】:

我在 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;
  }
}

任何人都可以帮助解决可能出现的问题吗?在此先感谢!

【问题讨论】:

  • 您是否已将事件接收器注册到相关列表/库?
  • 你所说的“如预期”是什么意思?现在发生了什么

标签: sharepoint sharepoint-2013


【解决方案1】:

好的,您应该考虑的事情很少。首先,我建议不要为您的列表使用硬编码的 URL,例如

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

而只是按名称加载它

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

另一件事是您的 Caml 查询。如果你想让你的listItems 排序(我不知道为什么,因为你正在更新所有项目)。您缺少&lt;View&gt;&lt;Query&gt; 节点。您的 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);

还应包括描述属性,如下面的代码 sn-p 所示

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@

【讨论】:

    猜你喜欢
    • 2012-11-14
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多