Compartir a través de


Complemento de SharePoint de ejemplo de extensiones de administración de registros

The ECM. El ejemplo RecordsManagement muestra cómo usar un complemento hospedado por el proveedor para controlar la configuración de administración de registros local para un sitio o lista.

Use esta solución si desea configurar las opciones de administración de registros locales durante el proceso de aprovisionamiento de sitios personalizado.

Antes de empezar

Para empezar, descargue el ECM. Complemento de ejemplo RecordsManagement del proyecto patrones y prácticas de desarrollador de Office 365 en GitHub.

Nota:

El código de este artículo se proporciona tal cual, sin garantía de ningún tipo, expresa o implícita, incluidas las garantías implícitas de aptitud para un propósito particular, comerciabilidad o ausencia de infracción.

Antes de ejecutar este complemento:

  1. Active la característica Administración de registros locales en la colección de sitios.

    Captura de pantalla de la página de funciones de colecciones de sitios con la característica de administración de registros locales activada resaltada.

  2. En Configuración del sitio, compruebe que vea Configuración de declaración de registros en Administración de colecciones de sitios.

    Captura de pantalla de la página Configuración del sitio con la configuración de la declaración de registro resaltada.

Uso del ECM. Complemento de ejemplo RecordsManagement

Al iniciar el ECM. Complemento RecordsManagement, la página de inicio muestra los dos escenarios que están disponibles:

  • Habilitación de la administración de registros locales para sitios (escenario 1)
  • Habilitación de la administración de registros locales para listas (escenario 2)

Captura de pantalla de la página de inicio del complemento, en la que se muestran los dos escenarios.

Puede usar el escenario 1 para compilar una interfaz de usuario con el fin de controlar la configuración de administración de registros en la colección de sitios. La interfaz de usuario de este complemento es similar a la interfaz de usuario que se encuentra en Configuración de declaración de registros en Configuración del sitio. También puede activar o desactivar la característica Administración de registros locales en la colección de sitios.

Puede usar el escenario 2 para crear una interfaz de usuario para controlar la configuración de administración de registros en las listas. La interfaz de usuario de este complemento es similar a la interfaz de usuario que se encuentra en La configuración de declaración de registros de la configuración de la biblioteca de la lista.

Captura de pantalla de la página Configuración de declaración como registro de biblioteca.

Escenario 1

El escenario 1 aborda las características de administración de registros locales y la configuración de los sitios. La interfaz de usuario del complemento incluye un botón Desactivar (o Activar), como se muestra en la ilustración siguiente. Al elegir este botón, se desactiva (o activa) la característica Administración de registros locales en la colección de sitios.

Captura de pantalla que muestra el botón activar o desactivar para la gestión de registros locales.

El código siguiente activa o desactiva la característica Administración de registros locales en la colección de sitios. Los métodos DisableInPlaceRecordsManagementFeature y EnableSiteForInPlaceRecordsManagement forman parte del archivo AppModelExtensions\RecordsManagementExtensions.cs de 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 incluye métodos de extensión para obtener y establecer toda la configuración de administración de registros locales con ámbito de sitio. El código siguiente del método EnableSiteForInPlaceRecordsManagement muestra cómo usar estos métodos de extensión para establecer restricciones y especificar quién puede declarar o anular la declaración de registros en el sitio.

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);
}

Cuando el usuario cambia la configuración de administración de registros local y elige el botón Guardar cambios , se ejecuta el código siguiente en el método btnSaveSiteScopedIPRSettings_Click .

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);
}

En el código anterior, se realiza una llamada al método SetRecordRestrictions en RecordsManagementExtensions.cs. El método SetRecordRestrictions del ejemplo siguiente muestra cómo establecer restricciones en los registros.

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);
}

Escenario 2

En el escenario 2 se muestra cómo interactuar con la configuración de administración de registros en contexto para las listas. Cuando se instala el complemento, crea una biblioteca de documentos denominada IPRTest. Cuando se usa este complemento para cambiar y guardar la configuración de administración de registros locales, los cambios se aplican a IPRTest.

Nota:

Para usar la configuración de administración de registros en contexto en una lista, debe activar la característica Administración de registros locales en la colección de sitios.

El código siguiente de Default.aspx.cs se ejecuta cuando un usuario elige el botón Guardar cambios .

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;
  }
}

El código llama a los dos métodos siguientes en el archivo RecordsManagementExtensions.cs de OfficeDevPnP.Core:

  • SetListManualRecordDeclaration : define la configuración de declaración de registros manuales para esta lista.
  • SetListAutoRecordDeclaration : declara automáticamente los elementos agregados a esta lista como un registro. Si la declaración de registros se establece en automática en esta lista, la configuración de declaración de registros manuales de la lista ya no se aplica. Los receptores de eventos se agregan a la lista para iniciar acciones específicas de administración de registros cuando se producen eventos.
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.
  }
}

Vea también