4

我正在编写一个代码,它将遍历共享点列表中的每个列表项并查找一个空字段。如果找到空字段,则会通过电子邮件通知负责该列表项的人员。

我在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();
}
4

1 回答 1

15

欢迎来到 SharePoint CSOM 地狱。

您确实加载了 List 和 FieldCollection,但您还必须加载每个 Field。事实上,您必须加载要从中获取属性的每个 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
        }
    }
}

编辑: 8 年后,我很长一段时间没有使用 SharePoint,但现在我看到了这个答案,我认为最好不要context.ExecuteQuery()循环调用。您可能应该对.Load每个感兴趣的字段使用第一个循环,然后调用.ExecuteQuery,最后再执行另一个循环来处理新加载的字段。

当涉及到网络请求时,尽量多一些,而不是喋喋不休:努力限制你做的请求的数量(当然,只要它是有意义的)。

于 2014-05-07T11:47:04.623 回答