C#: Sharepoint字段未初始化

4
我正在编写一段代码,将遍历SharePoint列表中的每个列表项并查找空字段。如果发现空字段,则通过电子邮件通知负责该列表项的人员。
val = oListItem[field.Title];这行出现了错误,它表示:
“属性或字段尚未初始化。它尚未被请求或请求尚未执行。可能需要显式请求。”
在那行代码之前,我已经完成了所有初始化工作。
static void Main()
{
    ClientContext context    = new ClientContext("https://****");
    context.Credentials      = new NetworkCredential("****", "****");
    List oList               = context.Web.Lists.GetByTitle("TestBI");
    FieldCollection fieldcol = oList.Fields;

    context.Load(oList);
    context.Load(fieldcol);
    context.ExecuteQuery();

    ListItem oListItem = oList.GetItemById(1);
    object val = null;

    for (int i = 1; i <= 4; i++)
    {
        oListItem = oList.GetItemById(i);
        foreach (Field field in fieldcol)
        {
            val = oListItem[field.Title];
            if(val == null)
            {
                //Send e-mail
            }
        }
    }
    context.ExecuteQuery();
}
1个回答

15

欢迎来到SharePoint CSOM地狱。

您已经加载了列表和字段集合,但是您还需要加载每个字段。事实上,您必须加载每个您想要获取属性的SharePoint对象。

for (int i = 1; i <= 4; i++)
{
    oListItem = oList.GetItemById(i);
    
    foreach (Field field in fieldcol)
    {
        context.Load(field);
        context.ExecuteQuery();
        val = oListItem[field.Title];
        if(val == null)
        {
            //Send e-mail
        }
    }
}

编辑:八年后,我已经很长时间没有使用SharePoint了。但是现在看着这个答案,我认为最好不要在循环中调用context.ExecuteQuery()。你应该先使用第一个循环.Load每个感兴趣的字段,然后调用.ExecuteQuery,最后再进行另一个循环以对新加载的字段进行操作。

当涉及到Web请求时,尽量保持大块头,而不是碎片式的交流:努力限制您所做的请求数量(只要有意义,当然)。


我尝试了,但在加载字段后的ExecuteQuery中出现错误:“项目不存在。可能已被其他用户删除。” 有什么建议吗? - user3158291
这很可能是完全不同的问题。请在此处查看http://stackoverflow.com/questions/15790926/client-object-model-get-item-by-id-item-does-not-exist-it-may-have-been-delete并搜索权限问题,我很遗憾没有太多与SharePoint这一方面的工作经验。 - Kilazur
我不确定那是否是问题所在。我使用的帐户对该站点和列表拥有完全控制权限。 - user3158291
也许是ID问题 http://stackoverflow.com/questions/6672604/item-does-not-exist-it-may-have-been-deleted-by-another-user 或者 https://dev59.com/p2rWa4cB1Zd3GeqP91ik ... 但是,我不能一直为你搜索 ;p 再次强调,这似乎是另一个问题,也许你应该开始一个新的问题。 - Kilazur
您之前的建议很有用。您说得对,第二个问题是由于我的SharePoint列表引起的。谢谢! - user3158291

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接