Beispiel für SharePoint-Add-In für Datensatzverwaltungserweiterungen

Der ECM. Das RecordsManagement-Beispiel zeigt, wie Sie ein vom Anbieter gehostetes Add-In verwenden, um die Einstellungen für die direkte Datensatzverwaltung für eine Website oder Liste zu steuern.

Verwenden Sie diese Lösung, wenn Sie während ihres benutzerdefinierten Websitebereitstellungsprozesses einstellungen für die direkte Datensatzverwaltung konfigurieren möchten.

Bevor Sie beginnen

Laden Sie zunächst das ECM herunter. RecordsManagement-Beispiel-Add-In aus dem Projekt Office 365 Developer Patterns and Practices auf GitHub.

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.

Bevor Sie dieses Add-In ausführen:

  1. Aktivieren Sie das Feature "In-Place Records Management" für die Websitesammlung.

    Screenshot der Websitesammlungsfeaturesseite mit hervorgehobenem aktiviertem Compliance-Datensatzverwaltungsfeature.

  2. Vergewissern Sie sich unter Websiteeinstellungen, dass unter WebsitesammlungsverwaltungEinstellungen für Datensatzdeklaration angezeigt werden.

    Screenshot der Seite Websiteeinstellungen mit hervorgehobenen Datensatzdeklarationseinstellungen.

Verwenden des ECM. RecordsManagement-Beispiel-Add-In

Wenn Sie das ECM starten. Das RecordsManagement-Add-In zeigt auf der Startseite die beiden verfügbaren Szenarien an:

  • Aktivieren der direkten Datensatzverwaltung für Websites (Szenario 1)
  • Aktivieren der direkten Datensatzverwaltung für Listen (Szenario 2)

Screenshot der Add-In-Startseite mit den beiden Szenarien.

Sie können Szenario 1 verwenden, um eine Benutzeroberfläche zum Steuern der Datensatzverwaltungseinstellungen in Ihrer Websitesammlung zu erstellen. Die Benutzeroberfläche in diesem Add-In ähnelt der Benutzeroberfläche in den Einstellungen für die Datensatzdeklaration in den Websiteeinstellungen. Sie können auch die Funktion Für die direkte Datensatzverwaltung in Ihrer Websitesammlung aktivieren oder deaktivieren.

Sie können Szenario 2 verwenden, um eine Benutzeroberfläche zum Steuern der Datensatzverwaltungseinstellungen in Listen zu erstellen. Die Benutzeroberfläche in diesem Add-In ähnelt der Benutzeroberfläche in den Einstellungen für die Deklaration von Datensätzen in den Bibliothekseinstellungen in Ihrer Liste.

Screenshot der Seite Bibliotheksdatensatz-Deklarationseinstellungen.

Szenario 1

Szenario 1 behandelt Funktionen und Einstellungen für die direkte Datensatzverwaltung für Websites. Die Add-In-Benutzeroberfläche enthält eine Schaltfläche Deaktivieren (oder Aktivieren), wie in der folgenden Abbildung dargestellt. Wenn Sie diese Schaltfläche auswählen, wird das Feature "Direkte Datensatzverwaltung " in der Websitesammlung deaktiviert (oder aktiviert).

Screenshot, auf dem die Deaktivierungs- und Aktivierungsschaltfläche für die Compliance-Datensatzverwaltung.

Der folgende Code aktiviert oder deaktiviert das Feature Für die direkte Datensatzverwaltung in der Websitesammlung. Die Methoden DisableInPlaceRecordsManagementFeature und EnableSiteForInPlaceRecordsManagement sind Teil der Datei AppModelExtensions\RecordsManagementExtensions.cs in OfficeDevPnP.Core.

protected void btnToggleIPRStatus_Click(object sender, EventArgs e)
{
  if (cc.Site.IsInPlaceRecordsManagementActive())
  {
    cc.Site.DisableInPlaceRecordsManagementFeature();
    IPRStatusUpdate(false);
  }
  else
  {
    cc.Site.EnableSiteForInPlaceRecordsManagement();
    IPRStatusUpdate(true);
  }
}

OfficeDevPnP.Core enthält Erweiterungsmethoden zum Abrufen und Festlegen aller standortbezogenen Einstellungen für die Verwaltung von Datensätzen. Der folgende Code der EnableSiteForInPlaceRecordsManagement-Methode zeigt, wie Sie diese Erweiterungsmethoden verwenden, um Einschränkungen festzulegen und anzugeben, wer Datensätze auf Ihrer Website deklarieren oder aufheben kann.

public static void EnableSiteForInPlaceRecordsManagement(this Site site)
{
  // Activate the In-Place Records Management feature if not yet enabled.
  if (!site.IsFeatureActive(new Guid(INPLACE_RECORDS_MANAGEMENT_FEATURE_ID)))
  {
    // Note: this also sets the ECM_SITE_RECORD_RESTRICTIONS value to "BlockDelete, BlockEdit".
    site.ActivateInPlaceRecordsManagementFeature();
  }

  // Enable in-place records management in all locations.
  site.SetManualRecordDeclarationInAllLocations(true);

  // Set restrictions to default values after enablement (this is also done at feature activation).
  EcmSiteRecordRestrictions restrictions = EcmSiteRecordRestrictions.BlockDelete | EcmSiteRecordRestrictions.BlockEdit;
  site.SetRecordRestrictions(restrictions);

  // Set record declaration to default value.
  site.SetRecordDeclarationBy(EcmRecordDeclarationBy.AllListContributors);

  // Set record undeclaration to default value.
  site.SetRecordUnDeclarationBy(EcmRecordDeclarationBy.OnlyAdmins);
}

Wenn der Benutzer seine Einstellungen für die direkte Datensatzverwaltung ändert und die Schaltfläche Änderungen speichern auswäht, wird der folgende Code in der btnSaveSiteScopedIPRSettings_Click-Methode ausgeführt.

protected void btnSaveSiteScopedIPRSettings_Click(object sender, EventArgs e)
{
  EcmSiteRecordRestrictions restrictions = (EcmSiteRecordRestrictions)Convert.ToInt32(rdRestrictions.SelectedValue);
  cc.Site.SetRecordRestrictions(restrictions);
  cc.Site.SetManualRecordDeclarationInAllLocations(Convert.ToBoolean(rdAvailability.SelectedValue));
  EcmRecordDeclarationBy declareBy = (EcmRecordDeclarationBy)Convert.ToInt32(rdDeclarationBy.SelectedValue);
  cc.Site.SetRecordDeclarationBy(declareBy);
  EcmRecordDeclarationBy unDeclareBy = (EcmRecordDeclarationBy)Convert.ToInt32(rdUndeclarationBy.SelectedValue);
  cc.Site.SetRecordUnDeclarationBy(unDeclareBy);
}

Im vorherigen Code wird die SetRecordRestrictions-Methode in RecordsManagementExtensions.cs aufgerufen. Die SetRecordRestrictions-Methode im nächsten Beispiel zeigt, wie Einschränkungen für die Datensätze festgelegt werden.

public static void SetRecordRestrictions(this Site site, EcmSiteRecordRestrictions restrictions)
{
  string restrictionsProperty = "";

  if (restrictions.Has(EcmSiteRecordRestrictions.None))
  {
    restrictionsProperty = EcmSiteRecordRestrictions.None.ToString();
  }
  else if (restrictions.Has(EcmSiteRecordRestrictions.BlockEdit))
  {
    // BlockEdit is always used in conjunction with BlockDelete.
    restrictionsProperty = EcmSiteRecordRestrictions.BlockDelete.ToString() + ", " + EcmSiteRecordRestrictions.BlockEdit.ToString();
  }
  else if (restrictions.Has(EcmSiteRecordRestrictions.BlockDelete))
  {
    restrictionsProperty = EcmSiteRecordRestrictions.BlockDelete.ToString();
  }

  // Set property bag entry.
  site.RootWeb.SetPropertyBagValue(ECM_SITE_RECORD_RESTRICTIONS, restrictionsProperty);
}

Szenario 2

Szenario 2 zeigt, wie Sie mit den Einstellungen für die direkte Datensatzverwaltung für Listen interagieren. Wenn das Add-In installiert wird, wird eine Dokumentbibliothek namens IPRTest erstellt. Wenn Sie dieses Add-In verwenden, um die Einstellungen für die direkte Datensatzverwaltung zu ändern und zu speichern, werden die Änderungen auf IPRTest angewendet.

Hinweis

Um einstellungen für die direkte Datensatzverwaltung für eine Liste zu verwenden, müssen Sie das Feature Direkte Datensatzverwaltung für Ihre Websitesammlung aktivieren.

Der folgende Code in Default.aspx.cs wird ausgeführt, wenn ein Benutzer auf die Schaltfläche Änderungen speichern klickt.

protected void btnSaveListScopedIPRSettings_Click(object sender, EventArgs e)
{
  List ipr = cc.Web.GetListByTitle(IPR_LIBRARY);
  EcmListManualRecordDeclaration listManual = (EcmListManualRecordDeclaration)Convert.ToInt32(rdListAvailability.SelectedValue);
  ipr.SetListManualRecordDeclaration(listManual);
  ipr.SetListAutoRecordDeclaration(chbAutoDeclare.Checked);

  // Refresh the settings as AutoDeclare changes the manual settings.
  if (ipr.IsListRecordSettingDefined())
  {
    rdListAvailability.SelectedValue = Convert.ToString((int)ipr.GetListManualRecordDeclaration());
    chbAutoDeclare.Checked = ipr.GetListAutoRecordDeclaration();
    rdListAvailability.Enabled = !chbAutoDeclare.Checked;
  }
}

Der Code ruft die folgenden beiden Methoden in der Datei RecordsManagementExtensions.cs von OfficeDevPnP.Core auf:

  • SetListManualRecordDeclaration : Definiert die Einstellung für die manuelle Datensatzdeklaration für diese Liste.
  • SetListAutoRecordDeclaration : Deklariert Elemente, die dieser Liste hinzugefügt wurden, automatisch als Datensatz. Wenn die Datensatzdeklaration für diese Liste auf automatisch festgelegt ist, gelten die Einstellungen für die manuelle Datensatzdeklaration in der Liste nicht mehr. Ereignisempfänger werden der Liste hinzugefügt, um bestimmte Datensatzverwaltungsaktionen zu starten, wenn Ereignisse auftreten.
public static void SetListManualRecordDeclaration(this List list, EcmListManualRecordDeclaration settings)
{
  if (settings == EcmListManualRecordDeclaration.UseSiteCollectionDefaults)
  {
    // If you set list record declaration back to the default values, you also need to
    // turn off auto record declaration. Other property bag values are left as is; when
    // settings are changed again these properties are also again usable.
    if (list.PropertyBagContainsKey(ECM_AUTO_DECLARE_RECORDS))
    {
      list.SetListAutoRecordDeclaration(false);
    }
    // Set the property that dictates custom list record settings to false.
    list.SetPropertyBagValue(ECM_IPR_LIST_USE_LIST_SPECIFIC, false.ToString());
  }
  else if (settings == EcmListManualRecordDeclaration.AlwaysAllowManualDeclaration)
  {
    list.SetPropertyBagValue(ECM_ALLOW_MANUAL_DECLARATION, true.ToString());
    // Set the property that dictates custom list record settings to true.
    list.SetPropertyBagValue(ECM_IPR_LIST_USE_LIST_SPECIFIC, true.ToString());
  }
  else if (settings == EcmListManualRecordDeclaration.NeverAllowManualDeclaration)
  {
    list.SetPropertyBagValue(ECM_ALLOW_MANUAL_DECLARATION, false.ToString());
    // Set the property that dictates custom list record settings to true.
    list.SetPropertyBagValue(ECM_IPR_LIST_USE_LIST_SPECIFIC, true.ToString());
  }
  else
  {
    throw new ArgumentOutOfRangeException("settings");
  }
}

public static void SetListAutoRecordDeclaration(this List list, bool autoDeclareRecords)
{
  // Determine the SharePoint version based on the loaded CSOM library.
  Assembly asm = Assembly.GetAssembly(typeof(Microsoft.SharePoint.Client.Site));
  int sharePointVersion = asm.GetName().Version.Major;

  if (autoDeclareRecords)
  {
    // Set the property that dictates custom list record settings to true.
    list.SetPropertyBagValue(ECM_IPR_LIST_USE_LIST_SPECIFIC, true.ToString());
    // Prevent manual declaration.
    list.SetPropertyBagValue(ECM_ALLOW_MANUAL_DECLARATION, false.ToString());

    // Hook up the needed event handlers.
    list.Context.Load(list.EventReceivers);
    list.Context.ExecuteQuery();

    List<EventReceiverDefinition> currentEventReceivers = new List<EventReceiverDefinition>(list.EventReceivers.Count);
    currentEventReceivers.AddRange(list.EventReceivers);

    // Track changes to see if a list.Update is needed.
    bool eventReceiverAdded = false;

    // ItemUpdating receiver.
    EventReceiverDefinitionCreationInformation newEventReceiver = CreateECMRecordEventReceiverDefinition(EventReceiverType.ItemUpdating, 1000, sharePointVersion);
    if (!ContainsECMRecordEventReceiver(newEventReceiver, currentEventReceivers))
    {
      list.EventReceivers.Add(newEventReceiver);
      eventReceiverAdded = true;
    }
    // ItemDeleting receiver.
    newEventReceiver = CreateECMRecordEventReceiverDefinition(EventReceiverType.ItemDeleting, 1000, sharePointVersion);
    if (!ContainsECMRecordEventReceiver(newEventReceiver, currentEventReceivers))
    {
      list.EventReceivers.Add(newEventReceiver);
      eventReceiverAdded = true;
    }
    // ItemFileMoving receiver.
    newEventReceiver = CreateECMRecordEventReceiverDefinition(EventReceiverType.ItemFileMoving, 1000, sharePointVersion);
    if (!ContainsECMRecordEventReceiver(newEventReceiver, currentEventReceivers))
    {
      list.EventReceivers.Add(newEventReceiver);
      eventReceiverAdded = true;
    }
    // ItemAdded receiver.
    newEventReceiver = CreateECMRecordEventReceiverDefinition(EventReceiverType.ItemAdded, 1005, sharePointVersion);
    if (!ContainsECMRecordEventReceiver(newEventReceiver, currentEventReceivers))
    {
      list.EventReceivers.Add(newEventReceiver);
      eventReceiverAdded = true;
    }
    // ItemUpdated receiver.
    newEventReceiver = CreateECMRecordEventReceiverDefinition(EventReceiverType.ItemUpdated, 1007, sharePointVersion);
    if (!ContainsECMRecordEventReceiver(newEventReceiver, currentEventReceivers))
    {
      list.EventReceivers.Add(newEventReceiver);
      eventReceiverAdded = true;
    }
    // ItemCheckedIn receiver.
    newEventReceiver = CreateECMRecordEventReceiverDefinition(EventReceiverType.ItemCheckedIn, 1006, sharePointVersion);
    if (!ContainsECMRecordEventReceiver(newEventReceiver, currentEventReceivers))
    {
      list.EventReceivers.Add(newEventReceiver);
      eventReceiverAdded = true;
    }

    if (eventReceiverAdded)
    {
      list.Update();
      list.Context.ExecuteQuery();
    }

    // Set the property that dictates the autodeclaration.
    list.SetPropertyBagValue(ECM_AUTO_DECLARE_RECORDS, autoDeclareRecords.ToString());
  }
  else
  {
    // Set the property that dictates the autodeclaration.
    list.SetPropertyBagValue(ECM_AUTO_DECLARE_RECORDS, autoDeclareRecords.ToString());
    //Note: Existing list event handlers will just stay as they are, no need to remove them.
  }
}

Siehe auch