如何从 Sharepoint 客户端模型中的内容类型中删除网站栏引用 [英] How to delete a site-column reference from a content-type in Sharepoint Client model

查看:50
本文介绍了如何从 Sharepoint 客户端模型中的内容类型中删除网站栏引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试直接从我的代码中删除 sharepoint 网站中的站点栏.这些网站栏目前在某些内容类型下被引用.所以当我执行代码时

I am trying to delete a site-columns from the sharepoint website directly from my code. These site-columns are currently referenced under some content-types. So when I execute a code

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

抛出异常

不能删除包含在内容类型中的站点列.在删除它之前删除对此网站栏的所有引用.

Site columns which are included in content types cannot be deleted. Remove all references to this site column prior to deleting it.

任何人都可以提出一种首先从内容类型中删除该引用然后删除站点列的方法.

Can anyone please suggest a way to first remove that reference from the content-type and then delete the site-column.

代码如下:

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

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

Whenever I'm running this code, it throws me an exception:

附加信息:无法删除包含在内容类型或列表中的网站栏.请先删除此网站栏的所有实例,然后再删除.

Additional information: Site columns which are included in content types or on lists cannot be deleted. Please remove all instances of this site column prior to deleting it.

请建议我一种以编程方式完成此任务的方法.仅供参考,当我尝试从我的 Sharepoint 网站删除它时,它被删除了,没有任何错误.

Please suggest me a way to achieve this task programmatically. FYI, when I try to delete it from my Sharepoint website, it gets deleted without any error.

推荐答案

由于在内容类型中引用了网站栏,因此发生了指定的错误.

Since the site column is referenced in content type the specified error occurs.

以下示例(实现为扩展方法)演示了如何删除在内容类型中引用的网站栏:

The following examples (implemented as Extension methods) demonstrate how to delete site columns when it is referenced in content type(s):

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

使用

所有内容类型中删除网站栏和引用:

Delete site column and references from all content types:

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

从内容类型中删除网站栏和引用:

Delete site column and reference from content type:

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

这篇关于如何从 Sharepoint 客户端模型中的内容类型中删除网站栏引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆