C#更新SharePoint 2010列表项URL字段无报错但不生效问题
问题根因
SharePoint 2010 客户端对象模型(CSOM)自带变更追踪机制,对于URL字段对应的FieldUrlValue这类复杂引用类型,直接修改从FieldValues集合中取出的原对象属性,不会被客户端上下文识别为字段变更,因此调用ListItem.Update()时不会把该字段的修改提交到服务端,最终表现为代码无报错但字段值未更新。
另外原代码循环内每更新一条就执行一次ExecuteQuery()会产生大量冗余请求,性能很差。
修正后代码
ClientContext context = new ClientContext("http://www.sharepoint-site"); List myList = context.Web.Lists.GetByTitle("myListName"); CamlQuery query = CamlQuery.CreateAllItemsQuery(); ListItemCollection items = myList.GetItems(query); // 按需加载字段,减少不必要的数据传输 context.Load(items, its => its.Include( it => it.Id, it => it["_x0421__x0441__x044b__x043b__x04"] )); context.ExecuteQuery(); foreach (ListItem li in items) { FieldUrlValue oldUrlVal = li["_x0421__x0441__x044b__x043b__x04"] as FieldUrlValue; if (oldUrlVal != null && !string.IsNullOrEmpty(oldUrlVal.Url)) { // 关键:新建FieldUrlValue实例赋值,不要直接修改原取出的对象 FieldUrlValue newUrlVal = new FieldUrlValue() { Url = oldUrlVal.Url.Replace("usr", "users"), Description = oldUrlVal.Description // 保留原超链接的显示文本 }; li["_x0421__x0441__x044b__x043b__x04"] = newUrlVal; li.Update(); } } // 批量提交所有更新,大幅降低请求开销 context.ExecuteQuery();
关键注意点
- 所有CSOM复杂类型字段(URL、用户、查找、托管元数据等)更新时,都建议使用新实例赋值的方式,避免变更追踪失效的问题。
- 不要在遍历列表项的循环内重复调用
ExecuteQuery(),所有项调用Update()后统一提交即可,条目量超过2000条时可以分批提交,避免单次请求超时。 - 取值时加空值判断,避免字段未填值时触发空引用异常。
内容的提问来源于stack exchange,提问作者user8763613
相关产品推荐
相关产品推荐

