У меня сайт SharePoint 2010, настроенный локально для отладки со следующей топографией:
Main (SPSite)
-> Toolbox (SPWeb)
-> MyTool (SPWeb)
Я создал и развернул на Main следующее:
- Пользовательское поле "RequestedBy"
- Настраиваемое поле "OriginalRequestFileName"
- Пользовательский тип контента "RequestContentType", который содержит два вышеуказанных поля в дополнение к полям OOB
- Определение пользовательского списка "RequestListDefinition" на основе вышеуказанного ContentType
- 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, но я не видел никакой документации для этого.
Может кто-нибудь, пожалуйста, помогите мне решить:
- как я могу получить только те списки, которые получены из моего пользовательского определения списка; или
- как мне овладеть моим пользовательским типом контента; или
- укажете мне на лучшее решение для ограничения списка SPDocumentLibrary?
Спасибо !!