【问题标题】:Add a new list item with a Person or Group field添加具有人员或组字段的新列表项
【发布时间】:2013-04-06 00:17:57
【问题描述】:

我有一个 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;

    }

}

convertName() 中的 "-1;#" 是我在 this discussion 中看到的一种解决方法,可让您避免查找此人的 ID。但它不起作用;我在返回的 XML 中收到此错误消息:

0x81020054The user does not exist or is not unique.

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

【问题讨论】:

    标签: c# web-services sharepoint sharepoint-2007


    【解决方案1】:

    到目前为止,我的解决方案是使用People.asmx 网络服务。以下代码假设我创建了一个名为PeopleService 的Web 服务的引用,以及一个名为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 流量如果有很多名字。希望其他人有更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 2012-11-20
      相关资源
      最近更新 更多