使用 CSOM(不使用 XML)以编程方式在 SharePoint 中创建字段

Rob*_*bin 4 sharepoint csom

是否可以使用 CSOM 而不是使用 XML 在 SharePoint 中创建字段?

我见过很多使用 XML 的例子,但没有一个只是以编程方式设置字段的属性?

fields.Add(new **FieldCreationInformation** {
    InternalName = "Test",
   etc..
});
Run Code Online (Sandbox Code Playgroud)

Vad*_*hev 7

这是可行的,在下面的例子中引入了一个FieldCreationInformation class

[XmlRoot("Field")]
public class FieldCreationInformation
{
    [XmlAttribute("ID")]
    public Guid Id { get; set; }

    [XmlAttribute()]
    public string DisplayName { get; set; }

    [XmlAttribute("Name")]
    public string InternalName { get; set; }

    [XmlIgnore()]
    public bool AddToDefaultView { get; set; }


    //public IEnumerable<KeyValuePair<string, string>> AdditionalAttributes { get; set; }

    [XmlAttribute("Type")]
    public FieldType FieldType { get; set; }

    [XmlAttribute()]
    public string Group { get; set; }

    [XmlAttribute()]
    public bool Required { get; set; }


    public string ToXml()
    {
        var serializer = new XmlSerializer(GetType());
        var settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.OmitXmlDeclaration = true;
        var emptyNamepsaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });

        using (var stream = new StringWriter())
        using (var writer = XmlWriter.Create(stream, settings))
        {
            serializer.Serialize(writer, this, emptyNamepsaces);
            return stream.ToString();
        }
    }



    public FieldCreationInformation()
    {
        Id = Guid.NewGuid();
    }

}
Run Code Online (Sandbox Code Playgroud)

然后是用于创建新字段的扩展方法:

public static class FieldCollectionExtensions
{
    public static Field Add(this FieldCollection fields, FieldCreationInformation info)
    {
        var fieldSchema = info.ToXml();
        return fields.AddFieldAsXml(fieldSchema, info.AddToDefaultView, AddFieldOptions.AddFieldToDefaultView);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

var fieldInfo = new FieldCreationInformation();
fieldInfo.FieldType = FieldType.Geolocation;
fieldInfo.InternalName = "ContactsLocation";
fieldInfo.DisplayName = "Contacts Location";
ctx.Site.RootWeb.Fields.Add(fieldInfo);
ctx.ExecuteQuery();
Run Code Online (Sandbox Code Playgroud)