1

我有一个 DataTable,我想使用表的 DataRows 中的数据将新项目添加到 Sharepoint 列表。但是我无法为类型为“个人或组”的字段添加数据,因为该字段似乎需要一个 ID,而不仅仅是“姓氏,名字”。我创建了一个类来构建 CAML 以调用UpdateListItems(),它适用于将任何其他类型的数据添加到列表中:

public class CAMLBuilder
{
    List<string> nameFields;

    public CAMLBuilder()
    {
        nameFields = new List<string>();
        nameFields.Add("Requestor");
    }

    public XmlElement batchAddElement(DataTable addTable)
    {
        XmlDocument doc = new XmlDocument();
        XmlElement element = doc.CreateElement("Batch");
        element.SetAttribute("OnError", "Continue");
        element.SetAttribute("ListVersion", "1");
        element.SetAttribute("ViewName", "");
        int methodCtr = 1;
        string batchStr = "";
        foreach (DataRow dr in addTable.Rows)
        {
            batchStr += "<Method ID='" + methodCtr + "' Cmd='New'>";
            foreach (DataColumn dc in addTable.Columns)
            {
                batchStr+="<Field Name='"+dc.ColumnName+"'>" + convertName(dc.ColumnName,Convert.ToString(dr[dc])) + "</Field>";
            }
            batchStr+="</Method>";
            methodCtr++;
        }
        element.InnerXml = batchStr;
        return element;
    }

    private string convertName(string columnName,string name)
    {
        if (nameFields.Contains(columnName))
        {
            name = "-1;#" + name;
        }
        return name;

    }

}

我在本次讨论"-1;#"中将in视为一种解决方法,可让您避免查找此人的 ID。但它不起作用;我在返回的 XML 中收到此错误消息:convertName()

0x81020054The user does not exist or is not unique.

有没有办法构建 CAML,这样我就不需要 ID 并且可以只使用名称?

4

1 回答 1

0

到目前为止,我的解决方案是使用People.asmxWeb 服务。以下代码假定我创建了一个对名为 的 Web 服务的引用PeopleService,以及一个名为 的服务实例ps

public string findPersonID(string searchText)
        {
            PeopleService.PrincipalInfo[] arrayPrincipalInfo = ps.SearchPrincipals(searchText, 10, PeopleService.SPPrincipalType.All);
            if (arrayPrincipalInfo.Count() > 0)
            {
                return Convert.ToString(arrayPrincipalInfo[0].UserInfoID);
            }
            else
            {
                return string.Empty;
            }
        }

这并不理想,因为它要求我的 DataTable 中的每一行都必须单独调用 Web 服务(可能通过将所有相同的名称分组并为每个唯一名称只调用一次函数来优化),如果有的话,这将是很多 Web 流量很多名字。希望其他人有更好的解决方案。

于 2013-04-06T01:44:52.770 回答