Как удалить ссылку на столбец сайта из типа контента в модели клиента Sharepoint

Я пытаюсь удалить столбцы сайта с сайта sharepoint прямо из моего кода. Эти столбцы сайта в настоящее время упоминаются в некоторых типах контента. Итак, когда я выполняю код

//Delete the site-column
conFields.DeleteObject();
clientContext.ExecuteQuery();
break;

это выдает исключение

Столбцы сайта, включенные в типы контента, удалить нельзя. Удалите все ссылки на этот столбец сайта перед его удалением.

Может ли кто-нибудь предложить способ сначала удалить эту ссылку из типа контента, а затем удалить столбец сайта.

Вот код:

//availableCT is my content-type
 FieldCollection fieldColl = availableCT.Fields;
clientContext.Load(fieldColl);
clientContext.ExecuteQuery();
foreach (Field field in fieldColl)
{
  //columnFromList is the column taht is to be deleted
  if (field.InternalName.Equals(columnFromList))
  {
    field.DeleteObject();
    clientContext.executeQuery();
  }
}

Всякий раз, когда я запускаю этот код, он выдает исключение:

Дополнительная информация: столбцы сайта, которые включены в типы контента или в списки, не могут быть удалены. Пожалуйста, удалите все экземпляры этого столбца сайта перед его удалением.

Пожалуйста, предложите мне программный способ решения этой задачи. К вашему сведению, когда я пытаюсь удалить его со своего веб-сайта Sharepoint, он удаляется без каких-либо ошибок.


person Abhishek    schedule 04.02.2015    source источник
comment
Может ли кто-нибудь помочь мне найти ответ?   -  person Abhishek    schedule 06.02.2015


Ответы (1)


Поскольку столбец сайта упоминается в типе контента, возникает указанная ошибка.

Следующие ниже примеры (реализованные как методы расширения) демонстрируют, как удалить столбцы сайта. когда он упоминается в типе (ах) контента:

public static class FieldExtensions
{
    /// <summary>
    /// Remove column and reference from specific content types
    /// </summary>
    /// <param name="field"></param>
    /// <param name="contentTypeId"></param>
    public static void DeleteObject(this Field field,string contentTypeId)
    {
        var ctx = field.Context as ClientContext;
        if (!field.IsPropertyAvailable("Id"))
        {
            ctx.Load(field, f => f.Id);
            ctx.ExecuteQuery();
        }
        //Firstly, remove site column from content type
        var contentType = ctx.Site.RootWeb.ContentTypes.GetById(contentTypeId);
        var fieldLinks = contentType.FieldLinks;
        var fieldLinkToRemove = fieldLinks.GetById(field.Id);
        fieldLinkToRemove.DeleteObject();
        contentType.Update(true); //push changes
        //Then remove column
        field.DeleteObject();
    }


    /// <summary>
    /// Remove column and references from all content types
    /// </summary>
    /// <param name="field"></param>
    /// <param name="includeContentTypes"></param>
    public static void DeleteObject(this Field field, bool includeContentTypes)
    {
        var ctx = field.Context as ClientContext;
        if (!field.IsPropertyAvailable("Id"))
        {
            ctx.Load(field, f => f.Id);
            ctx.ExecuteQuery();
        }
        //Firstly, remove site column link from all content types
        ctx.Load(ctx.Site.RootWeb.AvailableContentTypes, cts => cts.Include(ct => ct.FieldLinks));
        ctx.ExecuteQuery();
        foreach (var ct in ctx.Site.RootWeb.AvailableContentTypes)
        {
            var containsField = ct.FieldLinks.Any(fl => fl.Id == field.Id);
            if (containsField)
            {
                var fieldLinkToRemove = ct.FieldLinks.GetById(field.Id);
                fieldLinkToRemove.DeleteObject();
                ct.Update(true); //push changes         
            }
        }
        //Then remove site column
        field.DeleteObject();
    }
}

Использование

Удалите столбец сайта и ссылки из всех типов контента:

using (var ctx = ClientContext(webUri))
{        
    var siteFields = ctx.Site.RootWeb.Fields;
    var fieldToDel = siteFields.GetByInternalNameOrTitle(fieldName);
    fieldToDel.DeleteObject(true);
    ctx.ExecuteQuery();
}

Удалите столбец сайта и ссылку из типа контента:

using (var ctx = ClientContext(webUri))
{        
   //find content type
   var result = ctx.LoadQuery(ctx.Site.RootWeb.AvailableContentTypes.Where(ct => ct.Name == "Order Document"));
   ctx.ExecuteQuery();

   if (result.Any())
   {
       var ctId = result.First().Id.StringValue;
       var siteFields = ctx.Site.RootWeb.Fields;
       var fieldToDel = siteFields.GetByInternalNameOrTitle(fieldName);
       fieldToDel.DeleteObject(ctId);
       ctx.ExecuteQuery();
   }
}
person Vadim Gremyachev    schedule 17.04.2015