如何检查文档库 (SPDocumentLibrary) 是否支持特定的 ContentType

我在本地设置了一个 SharePoint 2010 站点,用于使用以下拓扑进行调试:

Main (SPSite)
 -> Toolbox (SPWeb)
    -> MyTool (SPWeb)

我已创建并将以下内容部署到 Main:

1.自定义字段“RequestedBy”
2.自定义字段“OriginalRequestFileName”
3.自定义内容类型“RequestContentType”,除了OOB字段外还包含以上两个字段
4.基于上述ContentType的自定义列表定义“RequestListDefinition”

  1. VisualWebPart“MyFileUploaderWebPart”,它有一个自定义的EditorPart,允许用户定义文件应该上传到哪个文档库。

我在 MyTool 中创建了一个基于我的自定义列表定义“RequestListDefinition”的列表“我的请求列表”的实例。

在 EditorPart 中,我有一个文档库的下拉列表。

 private void PopulateDocumentLibraryList(DropDownList dropDownList)
    {
        SPWeb currentWebsite = SPContext.Current.Web;

        SPListCollection lists = currentWebsite.GetListsOfType(SPBaseType.DocumentLibrary);
        if (lists.Count > 0)
        {
            List<SPDocumentLibrary> docLibraries = lists.Cast<SPList>()
                .Select(list => list as SPDocumentLibrary)
                .Where(library => library != null && !library.IsCatalog && !library.IsSiteAssetsLibrary)
                .ToList();

            dropDownList.DataSource = docLibraries;
            dropDownList.DataTextField = "Title";
            dropDownList.DataValueField = "ID";
            dropDownList.DataBind();

            // Default the selected item to the first entry
            dropDownList.SelectedIndex = 0;
        }
    }

我想将文档库列表限制为仅从我部署的自定义列表定义派生的那些。我想通过检查支持的内容类型来做到这一点,因此尝试将 Where 子句更改为:

private void PopulateDocumentLibraryList(DropDownList dropDownList)
{
    SPWeb currentWebsite = SPContext.Current.Web;

    SPListCollection lists = currentWebsite.GetListsOfType(SPBaseType.DocumentLibrary);
    if (lists.Count > 0)
    {   
        SPContentType voucherRequestListContentType = currentWebsite.ContentTypes["VoucherRequestContentType"];
        List<SPDocumentLibrary> docLibraries = lists.Cast<SPList>()
            .Select(list => list as SPDocumentLibrary)
            .Where(library => library != null && !library.IsCatalog && !library.IsSiteAssetsLibrary && library.IsContentTypeAllowed(voucherRequestListContentType))
            .ToList();

        dropDownList.DataSource = docLibraries;
        dropDownList.DataTextField = "Title";
        dropDownList.DataValueField = "ID";
        dropDownList.DataBind();

        // Default the selected item to the first entry
        dropDownList.SelectedIndex = 0;
    }
}

但它会出现以下错误:

Server Error in '/' Application.
--------------------------------------------------------------------------------

Value cannot be null.
Parameter name: ct 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentNullException: Value cannot be null.
Parameter name: ct

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 

[ArgumentNullException: Value cannot be null.
Parameter name: ct]
   Microsoft.SharePoint.SPList.IsContentTypeAllowed(SPContentType ct) +26981638
   Dominos.OLO.WebParts.FileUploader.<>c__DisplayClass7.<PopulateDocumentLibraryList>b__4(SPDocumentLibrary library) +137
   System.Linq.WhereEnumerableIterator`1.MoveNext() +269
   System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +578
   System.Linq.Enumerable.ToList(IEnumerable`1 source) +78
   Dominos.OLO.WebParts.FileUploader.DocumentLibrarySelectorEditorPart.PopulateDocumentLibraryList(DropDownList dropDownList) +801
   Dominos.OLO.WebParts.FileUploader.DocumentLibrarySelectorEditorPart.CreateChildControls() +154
   System.Web.UI.Control.EnsureChildControls() +146
   Dominos.OLO.WebParts.FileUploader.DocumentLibrarySelectorEditorPart.SyncChanges() +102
   Microsoft.SharePoint.WebPartPages.ToolPane.OnSelectedWebPartChanged(Object sender, WebPartEventArgs e) +283
   System.Web.UI.WebControls.WebParts.WebPartEventHandler.Invoke(Object sender, WebPartEventArgs e) +0
   Microsoft.SharePoint.WebPartPages.SPWebPartManager.BeginWebPartEditing(WebPart webPart) +96
   Microsoft.SharePoint.WebPartPages.SPWebPartManager.ShowToolPaneIfNecessary() +579
   Microsoft.SharePoint.WebPartPages.SPWebPartManager.OnPageInitComplete(Object sender, EventArgs e) +296
   System.EventHandler.Invoke(Object sender, EventArgs e) +0
   System.Web.UI.Page.OnInitComplete(EventArgs e) +11056990
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1674

这向我表明它无法找到内容类型。

我的另一个想法是尝试检索属于我的自定义列表定义类型“RequestListDefinition”的所有列表。但是,SPWeb.GetListsOfType() 采用 SPListTemplateType,它是一个枚举,因此不包含我的自定义列表定义。 SPListTemplateType ( http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splisttemplatetype.aspx ) 的文档建议使用接受字符串或 int 而不是 SPListTemplateType 的方法,但我还没有看到任何文档。

有人可以帮我解决吗:

  1. 我怎样才能得到那些从我的自定义列表定义中派生的列表;或者
  2. 如何获取我的自定义内容类型;或者
  3. 指出限制 SPDocumentLibrary 列表的更好解决方案的方向?

谢谢!!

stack overflow How to check if a Document Library (SPDocumentLibrary) supports a particular ContentType
原文答案

答案:

作者头像

第 2 点:

SPContentType 应该通过 currentWebsite.AvailableContentTypes[name] 检索。 ContentTypesSPWeb 属性仅返回在此特定 Web 上创建的内容类型。但是, AvailableContentTypes 确实返回当前网站集中可用的所有内容类型。

更新:要检查列表是否有您的内容类型,您应该使用列表上的内容类型集合:

SPContentTypeId ctId = voucherRequestListContentType.Id;

// LINQ where clause:
.Where(library => (...) && library.ContentTypes[ctID] != null);

SPList.IsContentTypeAllowed 方法检查给定的内容类型是否在列表中被支持,而不是内容类型是否是列表的一部分。请参阅 MSDN 文档 SPList.IsContentTypeAllowed Method

作者头像

我发现 IsApplicationList (SP 2013) 有助于限制作为非系统库的文档库(即 IsApplicationList 对于 _catalogs、SiteAssets 和 SitePages 是正确的,但对于共享文档不是)。

在 PowerShell 中,您可以通过运行以下命令看到这一点

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
Add-PsSnapin Microsoft.SharePoint.PowerShell
$site = Get-SPSite "http://sharePoint2013Url" 
$webs = $site.AllWebs
foreach($web in $webs)
{
    Write-Host "$($web.Url)"
    foreach($list in $web.GetListsOfType([Microsoft.SharePoint.SPBaseType]::DocumentLibrary))
    {
       Write-Host "$($list.DefaultEditFormUrl)  $($list.IsApplicationList)"
    }
}