You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SharePoint客户端对象模型添加列表项遇只读字段错误求助

SharePoint列表项更新报错“Invalid data has been used to update the list item”排查方案

先提个小细节:你说在用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:48:20