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

4

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

我看到很多例子都使用XML,但没有一个只是通过编程设置字段属性的例子。

fields.Add(new **FieldCreationInformation** {
    InternalName = "Test",
   etc..
});
2个回答

8

可以做到,下面介绍了一个FieldCreationInformation类的示例:

[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();
    }

}

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

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);
    }
}

用法

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

1
值得更多的是3票! 只需注意:在fields.AddFieldAsXml调用中添加AddFieldOptions.AddFieldInternalNameHintreturn fields.AddFieldAsXml(fieldSchema, info.AddToDefaultView, AddFieldOptions.AddFieldToDefaultView | AddFieldOptions.AddFieldInternalNameHint); - Evariste

0

当我使用CSOM/JSOM添加字段时,我使用FieldCollection的AddFieldAsXml方法。这需要您构建一个包含所需字段所有属性的XML字符串,但它是有效的。下面是相关代码的摘录:

Microsoft.SharePoint.Client.Web web = _context.Web;
FieldCollection fields = web.Fields;
_context.Load(fields);
_context.ExecuteQuery();

Field field = fields.FirstOrDefault(f => f.StaticName == _staticName);

if (field == null)
{
    Field createdField = fields.AddFieldAsXml(xml, false, AddFieldOptions.AddToNoContentType);
    _context.Load(createdField);
    _context.ExecuteQuery();

}

如果您想直接向现有列表添加字段,可以使用相似的代码。


是的,我用过那个。但问题是是否可以不使用 XML(AddFieldAsXml)实现。 - Robin
抱歉 - 我误读了你的问题。据我所知,没有一个好的方法来做到这一点。FieldCollection有一个Add方法,它接受一个Field对象,但是Field的构造函数没有提供一个方便的实例化方式(需要Context和ObjectPath)。你需要以那种方式添加Field吗? - Alex
不,我只是想摆脱 XML 而已 :) - Robin

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