Как проверить, поддерживает ли библиотека документов (SPDocumentLibrary) определенный ContentType - PullRequest
1 голос
/ 03 октября 2011

У меня сайт SharePoint 2010, настроенный локально для отладки со следующей топографией:

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

Я создал и развернул на Main следующее:

  1. Пользовательское поле "RequestedBy"
  2. Настраиваемое поле "OriginalRequestFileName"
  3. Пользовательский тип контента "RequestContentType", который содержит два вышеуказанных поля в дополнение к полям OOB
  4. Определение пользовательского списка "RequestListDefinition" на основе вышеуказанного ContentType
  5. 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) предлагает использовать метод, который принимает строку или целое число вместо SPListTemplateType, но я не видел никакой документации для этого.

Может кто-нибудь, пожалуйста, помогите мне решить:

  1. как я могу получить только те списки, которые получены из моего пользовательского определения списка; или
  2. как мне овладеть моим пользовательским типом контента; или
  3. укажете мне на лучшее решение для ограничения списка SPDocumentLibrary?

Спасибо !!

Ответы [ 2 ]

0 голосов
/ 16 января 2014

Я обнаружил, что 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)"
    }
}
0 голосов
/ 03 октября 2011

Точка 2:

SPContentType следует получить через currentWebsite.AvailableContentTypes[name].Свойство ContentTypes SPWeb возвращает только типы контента, созданные в данном конкретном веб-сайте.Однако AvailableContentTypes возвращает все типы контента, доступные в текущем семействе сайтов.

Обновление: Чтобы проверить, имеет ли список тип вашего контента, вы должны использовать коллекцию типов контентаlist:

SPContentTypeId ctId = voucherRequestListContentType.Id;

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

Метод SPList.IsContentTypeAllowed проверяет, является ли данный тип контента поддерживаемым в списке, а не является ли тип контента частью списка.См. Документацию MSDN SPList.IsContentTypeAllowed Метод .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...