我在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;
}
}
任何人都可以帮助解决问题吗?先谢谢!!
答案 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