无法删除SharePoint 2010 ContentType,“Content type in use.”

38
我尝试了网络上所有的建议,但都没有成功。
根据这些指示,我编写了一个控制台应用程序:http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spcontenttypecollection.delete.aspx。"Usages.Count"的值为0。但是,当尝试删除内容类型时,我会收到异常消息:"内容类型正在使用中"。
这是一个全新的(开发)安装。我在SP Designer中创建了一个测试网站,创建了一个内容类型,然后创建了一个列表。接着,我删除了该列表,将其从回收站中删除,并尝试删除内容类型...... 唉。

6
我找到了问题所在。我一直在读关于“两个”回收站的内容,检查了网站和“站点集合”的回收站,但错过了位于父网站顶部标有“站点集合回收站”的链接。点击该选项(然后选择“从终端用户回收站删除”),我成功移除了内容类型。 - Shayne
4个回答

74

在我发现你的评论之前,我对这个问题感到非常沮丧。 真是非常好的建议。

  1. 从站点回收站中删除。
  2. 从“网站收藏夹”>“网站设置”>“网站收藏夹管理”>“回收站”中删除。
  3. 从“终端用户回收站项”中删除。
  4. 从“已从终端用户回收站中删除”的位置中删除。

真的是很多的回收!完成后,我就可以删除内容类型了。


6
谢谢你节省了我6个小时的挫败感。 - skaz
3
以前无法正常工作,但现在我认识到有网站集合回收站和站点集合级别的最终用户回收站! - barrypicker
你可以在SharePoint SE上的我的回答中找到更多的原因。;) - Chiramisu

8
除了回收箱之外,在文档库的“权限和管理”下还有一个名为“管理没有检入版本的文件”的页面 - 该页面中的文件也可能会阻止内容类型的删除。

6

这个帖子里的PowerShell脚本对我也起作用了,可以用于删除应用程序功能中的内容类型。

$siteURL = "The Site url"
$contentType = "Content type Name"

$web = Get-SPWeb $siteURL
$ct = $web.ContentTypes[$contentType]

if ($ct) {
$ctusage = [Microsoft.SharePoint.SPContentTypeUsage]::GetUsages($ct)
      foreach ($ctuse in $ctusage) {
        $list = $web.GetList($ctuse.Url)
        $contentTypeCollection = $list.ContentTypes;
        $contentTypeCollection.Delete($contentTypeCollection[$contentType].Id);
        Write-host "Deleted $contentType content type from $ctuse.Url"
        }
$ct.Delete()
Write-host "Deleted $contentType from site."

} else { Write-host "Nothing to delete." }

$web.Dispose()

1
当我遇到一个网站内容类型,即使在每个级别的回收站中都已清空,仍无法删除时,以下方法对我有效。 - Alan M
在删除所有回收站后,这对我起作用了,但我仍然无法从UI中删除它。 - Vivek Ayer
1
不错,我已经忘记了某些子站点上使用的CT,而这段代码让我找到了它。只需添加一点:for-each内部的消息应该在$()中包含$ctuse.Url,以显示使用CT的URL: $($ctuse.Url) - GBU

0


    using System;
    using System.Collections.Generic;
    using Microsoft.SharePoint;

    namespace Test
    {
        class ConsoleApp
        {
            static void Main(string[] args)
            {
                using (SPSite siteCollection = new SPSite("http://localhost"))
                {
                    using (SPWeb webSite = siteCollection.OpenWeb())
                    {
                        // 获取过时的内容类型。
                        SPContentType obsolete = webSite.ContentTypes["Test"];

                        // 我们有一个内容类型。
                        if (obsolete != null) 
                        {
                            IList usages = SPContentTypeUsage.GetUsages(obsolete);

                            // 它正在使用中。
                            if (usages.Count > 0) 
                            {
                                Console.WriteLine("该内容类型正在以下位置中使用:");
                                foreach (SPContentTypeUsage usage in usages)
                                    Console.WriteLine(usage.Url);
                            }

                            //内容类型未被使用。
                            else 
                            {

                                // 删除它。
                                Console.WriteLine("正在删除内容类型{0}...", obsolete.Name);
                                webSite.ContentTypes.Delete(obsolete.Id);
                            }
                        }

                        // 没有找到内容类型。
                        else 
                        {
                            Console.WriteLine("该网站集合中不存在该内容类型。");
                        }
                    }
                }
                Console.Write("\n按 ENTER 键继续...");
                Console.ReadLine();
            }
        }
    }


创建一个控制台应用程序并运行该项目。此代码将告诉您附加内容类型的库。然后只需转到那些库并删除附加的内容类型。最后,从“站点操作”->“站点设置”->“网站内容类型”中删除内容类型,或者您也可以使用上述代码来删除内容类型。
这对我有用,希望对您也有用!!!谢谢。

只是让大家知道,上面的 (C#) 代码只是我在 OP 中提到过的那个(并附上了 URL)的“复制/粘贴”。 :) - Shayne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接