使用SharePoint客户端对象模型添加列表项遇只读字段错误求助
先提个小细节:你说在用SharePoint Client Object Model,但贴出来的代码其实是Server Object Model(用到了SPSite、SPWeb这类Server端类),不过咱们先聚焦解决你遇到的报错问题。
这个报错最常见的原因有以下几个,你可以逐一排查:
字段内部名称不匹配:你代码里用的是字段的显示名称(比如
Year Published),但SharePoint后台存储字段时,会把空格替换成_x0020_,所以这个字段的内部名称大概率是Year_x0020_Published。如果用显示名称赋值,SharePoint可能识别不到,甚至误匹配到其他只读字段。
怎么查看字段内部名称?进入列表设置页面,点击对应字段,看浏览器地址栏的URL,里面会有Field=xxxx的参数,那个xxxx就是内部名称。权限不足:运行这段代码的账号,有没有对
Books列表的编辑权限?比如如果是控制台程序,你运行程序的Windows账号需要拥有该站点列表的编辑权限;如果是SharePoint解决方案里的代码,要确认有没有正确处理权限上下文。字段被误设为只读:检查你的自定义列
Author和Year Published的属性,在列表设置里打开字段编辑页面,确认有没有勾选“禁止编辑”选项——有时候会不小心把必填字段误设成只读,导致无法赋值。
给你调整后的示例代码,建议用字段内部名称赋值,同时增加列表存在性检查:
string strUrl = "http://server/sites/training"; using (SPSite oSite = new SPSite(strUrl)) { using (SPWeb oWeb = oSite.OpenWeb()) { // 用TryGetList避免列表不存在时抛出异常 SPList list = oWeb.Lists.TryGetList("Books"); if (list != null) { SPListItem book = list.AddItem(); book["Title"] = "SQL Server Internals"; // 替换成你实际的Author字段内部名称 book["Author"] = "Mc Fredy"; // 替换成Year Published字段的实际内部名称,比如Year_x0020_Published book["Year_x0020_Published"] = 2015; try { book.Update(); } catch (SPException ex) { // 捕获异常查看具体错误信息,定位是哪个字段出问题 Console.WriteLine($"更新失败:{ex.Message}"); } } else { Console.WriteLine("未找到名为Books的列表"); } } }
如果还是没解决,建议捕获SPException查看详细错误信息,它会明确告诉你是哪个字段导致的问题,这样更容易定位根源。
内容的提问来源于stack exchange,提问作者FLICKER

