Beispiel-SharePoint-Add-In für Dokumentbibliotheksvorlagen
Das ECM.DocumentLibraries-Beispiel veranschaulicht, wie ein vom Anbieter gehostetes Add-In verwendet wird, um eine Liste oder Dokumentbibliothek zu erstellen, einen Inhaltstyp zuzuweisen und den Standardinhaltstyp zu entfernen.
Verwenden Sie diese Lösung, wenn Folgendes auf Sie zutrifft:
- Sie möchten eine Liste oder eine Dokumentbibliothek erstellen und einen Standardinhaltstyp anwenden.
- Sie möchten eine bessere Kontrolle über das Hinzufügen, das Warten oder die Implementierung lokalisierter Versionen Ihrer benutzerdefinierten Felder haben.
- Sie möchten den Standardinhaltstyp in einer Liste oder Bibliothek entfernen.
- Sie möchten Konfigurationseinstellungen für die Bibliothek anwenden, wenn Sie eine Liste oder Bibliothek erstellen.
Bevor Sie beginnen
Laden Sie zunächst das ECM.DocumentLibraries-Beispiel-Add-In aus dem Projekt „Office 365-Entwicklermuster und -vorgehensweisen“ auf GitHub herunter.
Hinweis
Der Code in diesem Artikel wird wie besehen und ohne jegliche Garantie zur Verfügung gestellt, gleich ob ausdrücklich oder konkludent, einschließlich jedweder stillschweigenden Gewährleistung der Eignung für einen bestimmten Zweck, Marktgängigkeit oder Nichtverletzung von Rechten.
Benutzer, die auf das ECM.DocumentLibraries-Beispiel-Add-In zugreifen, benötigen Berechtigungen zum Verwalten von Listen. Die DoesUserHavePermission-Methode in Default.aspx.cs überprüft die Berechtigungen des Benutzers, um sicherzustellen, dass dieser Listen verwalten kann. Wenn der Benutzer nicht über Berechtigungen zum Verwalten von Listen verfügt, zeigt das Add-In dem Benutzer eine Fehlermeldung an.
private bool DoesUserHavePermission()
{
var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
using (var ctx = spContext.CreateUserClientContextForSPHost())
{
BasePermissions perms = new BasePermissions();
perms.Set(PermissionKind.ManageLists);
ClientResult<bool> _permResult = ctx.Web.DoesUserHavePermissions(perms);
ctx.ExecuteQuery();
return _permResult.Value;
}
}
Verwenden des ECM.DocumentLibraries-Beispiel-Add-Ins
Wenn Sie dieses Add-In starten, wird die Startseite wie in der folgenden Abbildung angezeigt. Die ECM.DocumentLibraries-Startseite sieht wie die Seite aus, zu der eine neue Dokumentbibliothek hinzugefügt wird, wenn Sie Websiteinhalte>App hinzufügen>Dokumentbibliothek>Erweiterte Optionen auswählen. Es gibt nur einen Unterschied. Wenn Sie das Add-In starten, wird in der Dokumentvorlagenliste eine benutzerdefinierte Dokumentbibliotheksvorlage, ein IT-Dokument und ein Contoso-Dokument angezeigt. Wenn der Benutzer auf Erstellen klickt, wird der ausgewählte benutzerdefinierte Inhaltstyp der neuen Dokumentbibliothek zugewiesen.
Starten des ECM.DocumentLibraries-Beispiel-Add-Ins
Wenn Benutzer die Option Erstellen auswählen, überprüft die CreateLibrary_Click-Methode in Default.aspx.cs die ausgewählte Standardvorlage und ruft entweder die CreateITDocumentLibrary- oder die CreateContosoDocumentLibrary-Methode in ContentTypeManager.cs auf, wie im folgenden Code dargestellt.
protected void CreateLibrary_Click(object sender, EventArgs e)
{
try
{
var _spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
var _templateSelectedItem = this.DocumentTemplateType.Value;
var _libraryToCreate = this.GetLibraryToCreate();
using (var _ctx = _spContext.CreateUserClientContextForSPHost())
{
_ctx.ApplicationName = "AMS ECM.DocumentLibraries";
ContentTypeManager _manager = new ContentTypeManager();
switch(_templateSelectedItem)
{
case "IT Document":
_manager.CreateITDocumentLibrary(_ctx, _libraryToCreate);
break;
case "Contoso Document":
_manager.CreateContosoDocumentLibrary(_ctx, _libraryToCreate);
break;
}
}
Response.Redirect(this.Url.Value);
}
catch (Exception _ex)
{
throw;
}
}
Die CreateContosoDocumentLibrary-Methode führt dann die folgenden Aufgaben aus, wie im nächsten Codebeispiel gezeigt:
- Erstellt benutzerdefinierte Felder im verwalteten Metadatendienst.
- Erstellt einen Inhaltstyp.
- Weist den benutzerdefinierten Felder die Inhaltstypen zu.
- Erstellt die Dokumentbibliothek mit dem Inhaltstyp.
public void CreateContosoDocumentLibrary(ClientContext ctx, Library library)
{
// Check the fields.
if (!ctx.Web.FieldExistsById(FLD_CLASSIFICATION_ID)){
ctx.Web.CreateTaxonomyField(FLD_CLASSIFICATION_ID,
FLD_CLASSIFICATION_INTERNAL_NAME,
FLD_CLASSIFICATION_DISPLAY_NAME,
FIELDS_GROUP_NAME,
TAXONOMY_GROUP,
TAXONOMY_TERMSET_CLASSIFICATION_NAME);
}
// Check the content type.
if (!ctx.Web.ContentTypeExistsById(CONTOSODOCUMENT_CT_ID)){
ctx.Web.CreateContentType(CONTOSODOCUMENT_CT_NAME,
CT_DESC, CONTOSODOCUMENT_CT_ID,
CT_GROUP);
}
// Associate fields to content types.
if (!ctx.Web.FieldExistsByNameInContentType(CONTOSODOCUMENT_CT_NAME, FLD_CLASSIFICATION_INTERNAL_NAME)){
ctx.Web.AddFieldToContentTypeById(CONTOSODOCUMENT_CT_ID,
FLD_CLASSIFICATION_ID.ToString(),
false);
}
CreateLibrary(ctx, library, CONTOSODOCUMENT_CT_ID);
}
CreateContosoDocumentLibrary ruft die CreateTaxonomyField-Methode auf, die Teil von OfficeDevPnP.Core ist. CreateTaxonomyField erstellt ein Feld im verwalteten Metadatendienst aus dem vom Anbieter gehosteten Add-In.
public static Field CreateTaxonomyField(this Web web, Guid id, string internalName, string displayName, string group, TermSet termSet, bool multiValue = false)
{
internalName.ValidateNotNullOrEmpty("internalName");
displayName.ValidateNotNullOrEmpty("displayName");
termSet.ValidateNotNullOrEmpty("termSet");
try
{
var _field = web.CreateField(id, internalName, multiValue ? "TaxonomyFieldTypeMulti" : "TaxonomyFieldType", true, displayName, group, "ShowField=\"Term1033\"");
WireUpTaxonomyField(web, _field, termSet, multiValue);
_field.Update();
web.Context.ExecuteQuery();
return _field;
}
catch (Exception)
{
/// If there is an exception, the hidden field might be present.
FieldCollection _fields = web.Fields;
web.Context.Load(_fields, fc => fc.Include(f => f.Id, f => f.InternalName));
web.Context.ExecuteQuery();
var _hiddenField = id.ToString().Replace("-", "");
var _field = _fields.FirstOrDefault(f => f.InternalName == _hiddenField);
if (_field != null)
{
_field.DeleteObject();
web.Context.ExecuteQuery();
}
throw;
}
}
CreateContosoDocumentLibrary ruft die CreateContentType-Methode auf, die Teil von OfficeDevPnP.Core ist. CreateContentType erstellt einen neuen Inhaltstyp.
public static ContentType CreateContentType(this Web web, string name, string description, string id, string group, ContentType parentContentType = null)
{
LoggingUtility.Internal.TraceInformation((int)EventId.CreateContentType, CoreResources.FieldAndContentTypeExtensions_CreateContentType01, name, id);
// Load the current collection of content types.
ContentTypeCollection contentTypes = web.ContentTypes;
web.Context.Load(contentTypes);
web.Context.ExecuteQuery();
ContentTypeCreationInformation newCt = new ContentTypeCreationInformation();
// Set the properties for the content type.
newCt.Name = name;
newCt.Id = id;
newCt.Description = description;
newCt.Group = group;
newCt.ParentContentType = parentContentType;
ContentType myContentType = contentTypes.Add(newCt);
web.Context.ExecuteQuery();
// Return the content type object.
return myContentType;
}
CreateContosoDocumentLibrary ruft die AddFieldToContentTypeById-Methode auf, die Teil von OfficeDevPnP.Core ist. AddFieldToContentTypeById weist einem Feld einen Inhaltstyp zu.
public static void AddFieldToContentTypeById(this Web web, string contentTypeID, string fieldID, bool required = false, bool hidden = false)
{
// Get content type.
ContentType ct = web.GetContentTypeById(contentTypeID);
web.Context.Load(ct);
web.Context.Load(ct.FieldLinks);
web.Context.ExecuteQuery();
// Get field.
Field fld = web.Fields.GetById(new Guid(fieldID));
// Add field association to content type.
AddFieldToContentType(web, ct, fld, required, hidden);
}
CreateContosoDocumentLibrary ruft die CreateLibrary-Methode in ContentTypeManager.cs auf, um die Dokumentbibliothek zu erstellen. Die CreateLibrary-Methode weist Bibliothekseinstellungen wie die Beschreibung, die Dokumentversion sowie zugewiesene Inhaltstypen der Dokumentbibliothek zu.
private void CreateLibrary(ClientContext ctx, Library library, string associateContentTypeID)
{
if (!ctx.Web.ListExists(library.Title))
{
ctx.Web.AddList(ListTemplateType.DocumentLibrary, library.Title, false);
List _list = ctx.Web.GetListByTitle(library.Title);
if(!string.IsNullOrEmpty(library.Description)) {
_list.Description = library.Description;
}
if(library.VerisioningEnabled) {
_list.EnableVersioning = true;
}
_list.ContentTypesEnabled = true;
_list.Update();
ctx.Web.AddContentTypeToListById(library.Title, associateContentTypeID, true);
// Remove the default Document Content Type.
_list.RemoveContentTypeByName(ContentTypeManager.DEFAULT_DOCUMENT_CT_NAME);
ctx.Web.Context.ExecuteQuery();
}
else
{
throw new Exception("A list, survey, discussion board, or document library with the specified title already exists in this website. Please choose another title.");
}
}
CreateLibrary ruft RemoveContentTypeByName in ListExtensions.cs auf, die Teil von OfficeDevPnP.Core ist. RemoveContentTypeByName entfernt den Standardinhaltstyp in der Dokumentbibliothek.
public static void RemoveContentTypeByName(this List list, string contentTypeName)
{
if (string.IsNullOrEmpty(contentTypeName))
{
throw (contentTypeName == null)
? new ArgumentNullException("contentTypeName")
: new ArgumentException(CoreResources.Exception_Message_EmptyString_Arg, "contentTypeName");
}
ContentTypeCollection _cts = list.ContentTypes;
list.Context.Load(_cts);
IEnumerable<ContentType> _results = list.Context.LoadQuery<ContentType>(_cts.Where(item => item.Name == contentTypeName));
list.Context.ExecuteQuery();
ContentType _ct = _results.FirstOrDefault();
if (_ct != null)
{
_ct.DeleteObject();
list.Update();
list.Context.ExecuteQuery();
}
}
Nachdem Sie die Dokumentbibliothek erstellt haben, gehen Sie in der Dokumentbibliothek zu Bibliothekseinstellungen, um den Namen, die Beschreibung, die Einstellung für die Dokumentversion, den Inhaltstyp sowie benutzerdefinierte Felder zu überprüfen, die das Add-In Ihrer Dokumentbibliothek zugewiesen hat.
Vom Add-In angewendete Bibliothekeinstellungen