首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Sharepoint客户端模型中的内容类型中删除站点列引用

如何从Sharepoint客户端模型中的内容类型中删除站点列引用
EN

Stack Overflow用户
提问于 2015-02-04 10:57:41
回答 1查看 2.4K关注 0票数 0

我正试图直接从我的代码中删除sharepoint网站中的一个站点列。这些站点列当前在某些内容类型下引用。所以当我执行一段代码

代码语言:javascript
复制
//Delete the site-column
conFields.DeleteObject();
clientContext.ExecuteQuery();
break;

它抛出一个异常

不能删除内容类型中包含的站点列。删除此站点列之前删除它的所有引用。

请任何人建议一种方法,首先从内容类型删除该引用,然后删除站点列。

下面是代码:

代码语言:javascript
复制
//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();
  }
}

每当我运行这段代码时,它都会抛出一个异常:

其他信息:不能删除内容类型或列表中包含的站点列。删除该网站列之前,请删除它的所有实例。

请建议我一种以编程方式完成这一任务的方法。FYI,当我尝试从我的Sharepoint网站删除它时,它会被删除,没有任何错误。

EN

回答 1

Stack Overflow用户

发布于 2015-04-17 15:01:45

由于站点列是在内容类型中引用的,因此会发生指定的错误。

以下示例(作为可拓方法实现)演示了如何删除内容类型中引用的站点列:

代码语言:javascript
复制
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();
    }
}

使用

从所有内容类型中删除站点列和引用:

代码语言:javascript
复制
using (var ctx = ClientContext(webUri))
{        
    var siteFields = ctx.Site.RootWeb.Fields;
    var fieldToDel = siteFields.GetByInternalNameOrTitle(fieldName);
    fieldToDel.DeleteObject(true);
    ctx.ExecuteQuery();
}

删除网站列和内容类型中的引用:

代码语言:javascript
复制
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();
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28319613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档