【问题标题】:Create field in SharePoint programmatically using CSOM (Not with XML)使用 CSOM 以编程方式在 SharePoint 中创建字段(不使用 XML)
【发布时间】:2016-01-07 14:38:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: sharepoint csom


    【解决方案1】:

    这是可行的,在下面的例子中引入了一个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();
        }
    
    }
    

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

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

    【讨论】:

    • 应该得到超过 3 票!请注意:在fields.AddFieldAsXml 调用中添加AddFieldOptions.AddFieldInternalNameHintreturn fields.AddFieldAsXml(fieldSchema, info.AddToDefaultView, AddFieldOptions.AddFieldToDefaultView | AddFieldOptions.AddFieldInternalNameHint);
    【解决方案2】:

    当我使用 CSOM/JSOM 添加字段时,我使用 FieldCollection AddFieldAsXml 上的方法。这需要您使用所需字段的所有属性构建一个 xml 字符串,但它可以工作。我在下面包含了相关 cpde 的摘录:

    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) 是否可行。
    • 我很抱歉 - 误读了您的问题。据我所知,没有一个好的方法可以做到这一点。 FieldCollection 有一个 Add 的方法,它接受一个 Field 对象,但是 Field 的 constructor 并没有提供一种愉快的方法来实例化一个(需要 Context 和 ObjectPath) 是否有理由需要在其中添加一个 Field方式?
    • 不,只是想摆脱 XML,仅此而已:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2012-09-05
    • 2014-10-17
    • 1970-01-01
    相关资源
    最近更新 更多