2016-01-07 2 views
2

Возможно ли создавать поля в SharePoint с помощью CSOM, а не с использованием XML?Создание поля в SharePoint программно с использованием CSOM (не с XML)

Я видел много примеров с использованием XML, но ни один из них не просто программно задавал свойства для поля?

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

ответ

2

Это выполнимо, в следующем примере вводится в 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(); 
+1

Сладкий, спасибо Вадиму! – Robin

0

Когда я добавляю поля с 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(); 

} 

Аналогичный код используется, если вы хотели бы добавить поле непосредственно к существующему списку.

+0

Да , Я использовал это. Вопрос был, если бы это было возможно без XML (AddFieldAsXml). – Robin

+0

Прошу прощения - неверно изложите свой вопрос. Насколько я знаю, это не очень хороший способ сделать это. У FieldCollection есть метод для 'Add', который принимает объект Field, но [конструктор] (https://msdn.microsoft.com/EN-US/library/microsoft.sharepoint.client.field.field.aspx) для поля не обеспечивает счастливый способ создания экземпляра (требуется Context и ObjectPath) Есть ли причина, по которой вам нужно добавить поле таким образом? – Alex

+0

Нет, просто хотел уйти от XML, вот и все :) – Robin

Смежные вопросы