Pregunta

Actualmente estoy desarrollando un controlador de eventos para SharePoint 2010 que establece los valores predeterminados para bibliotecas de documentos en la creación (tipos de contenido, configuraciones de versión, etc.). Tengo un problema con los conflictos de guardado al crear bibliotecas de documentos a través de la GUI, el receptor del evento no siempre se ejecuta después de que la GUI termina de guardar la lista.

supuse ListAdded Se llamaría después de que la GUI haya terminado de crear la lista y la haya guardado, pero no parece ser el caso. He intentado configurar propiedades en el ListAdding función, pero los cambios no se guardan (ya que la lista aún no se ha creado).

Recibo el siguiente mensaje al depurar en Visual Studio:

Salvar conflicto.
Sus cambios entran en conflicto con los realizados simultáneamente por otro usuario. Si desea que se apliquen sus cambios, haga clic en Vuelva a hacer su navegador web, actualice la página y vuelva a enviar sus cambios.

Con el rastro de la pila de:

Microsoft.sharepoint.spException no fue controlado por el código de usuario ErrorCode = -2130575305 nationalerRormessage = fallido HR detectado (HR = 0x81020037)

NativeStackTrace = "" Message = Guardar conflicto.

Sus cambios entran en conflicto con los realizados simultáneamente por otro usuario. Si desea que se apliquen sus cambios, haga clic en Vuelva a hacer su navegador web, actualice la página y vuelva a enviar sus cambios. Fuente = microsoft.sharePoint stacktrace: en microsoft.sharepoint.spglobal.handlecomException (Comexception Comex) en microsoft.sharepoint.library.sprequest.setListProps (String bStrurl, string bstrlistN, boolean bmigrate) en microsof ) at Company.SharePoint.EventReceivers.ListCreate.CompanyListCreateEventReceiver.ListAdded(SPListEventProperties properties) at Microsoft.SharePoint.SPEventManager.RunListEventReceiver(SPListEventReceiver receiver, SPUserCodeInfo userCodeInfo, SPListEventProperties properties, String receiverData) at Microsoft.SharePoint.SPEventManager.RunListEventReceiverHelper(Object receiver, SpuserCodeInfo UserCodeInfo, Propiedades del objeto, contexto de SpeventContext, String receperData) en Microsoft.sharepoint.speventManager. <> C__DisplayClassC`1.b__6 () en Microsoft.sharepoint.SpSecurity.RunasUser (SpuserTOWARE : System.runtime.inTeropservices.comex ceptar

y los registros de ULS de:

25/02/2011 11: 12: 52.06 w3wp.exe (0x363c) 0x219c SharePoint Foundation General 8e2s Medium desconocido Error de bizcocencia. Más información: 0x8007047e F35857AF-3D3A-462C-86A6-DE24D3B3D8D3
25/02/2011 11: 12: 52.06 w3wp.exe (0x363c) 0x219c SharePoint Foundation General 72k4 Medium 0x8007047e F35857af-3D3A-462C-86A6-De24D3B3D8D33
25/02/2011 11: 12: 52.06 w3wp.exe (0x363c) 0x219c SharePoint Foundation General 8KH7 High 0x8007047e F35857af-3D3A-462C-86A6-De24D3B3D8D3

¿Hay alguna forma de garantizar que el conflicto no suceda, o una forma diferente de establecer o acceder a las propiedades de la lista que no entrarán en conflicto? Me he cansado de crear una instancia separada de SPSIT/SPWEB, pero eso todavía tiene el mismo problema.

Un ejemplo simple del código que está fallando es:

  public class CompanyListCreateEventReceiver : SPListEventReceiver
    {

        public override void ListAdded(SPListEventProperties properties)
        {
            base.ListAdded(properties);

            SPList l_list = properties.List;
            l_list.Title = "Changed title";
            l_list.Update();

        }
}

Cualquier ayuda sería apreciada. ¡Gracias!

¿Fue útil?

Solución

Debe registrar el evento ItemAdded como evento sincrónico.SpeventReceiversyncronization.synchronous

Puede definirlo programáticamente:http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.speventreCeiverDefinition.synchronization.aspx

O en el elemento receptor de la definición de características:http://msdn.microsoft.com/en-us/library/ff512765.aspx

Otros consejos

He estado luchando con los receptores de eventos de SharePoint desde hace algún tiempo. Muchas trampas y lógica inesperada en esta parte de SharePoint IMO.

No he visto este problema exacto antes, pero de todos modos puedo darte una sugerencia. En mi experiencia, cambiar la lista de propiedades a veces puede tener problemas. Por eso quiero obtener la lista de la web. Si esto falla (funcionó para mí), intente instanciar un nuevo SPWEB de Web.url también.

En este caso, le sugiero que intente el siguiente enfoque:

 public class CompanyListCreateEventReceiver : SPListEventReceiver
{

    public override void ListAdded(SPListEventProperties properties)
    {
        base.ListAdded(properties);

        SPList l_list = properties.Web.Lists[properties.List.ID];
        l_list.Title = "Changed Title";
        l_list.Update();
    }
}

Supongo que es posible que deba especificar "sincrónico" en su archivo element.xml, consulte http://sharepointconnoisseur.blogspot.com/2011/04/save-conflict-error-when-creating-list.html

Intente usar el evento DISHAT y habilitar métodos de eventos.

2) (útil en la actualización del elemento del controlador de eventos)

Item[FieldName] = FieldValue;
this.DisableEventFiriing();
item.SystemUpdate(false);
or
item.Update();
this.EnableEventFiring();
//must enable event firing if we are disable it
Licenciado bajo: CC-BY-SA con atribución
scroll top