Question

Je développe actuellement un gestionnaire d'événements pour SharePoint 2010 qui définit les valeurs par défaut pour les bibliothèques de documents sur la création (types de contenu, les paramètres de version, etc.). Je suis un problème avec des conflits d'enregistrement lors de la création des bibliothèques de documents via l'interface utilisateur, le récepteur d'événements ne sont pas toujours courir après l'interface graphique se fait enregistrer la liste.

Je supposais ListAdded serait appelé après l'interface graphique a bien fini de créer la liste et enregistré, mais il ne semble pas être le cas. J'ai essayé de définir les propriétés dans la fonction ListAdding, mais les modifications ne sont pas enregistrées (comme la liste est pas encore créé).

Je reçois le message suivant lors du débogage dans Visual Studio:

Save Conflict.
Vos modifications en conflit avec celles qui sont faites en même temps par un autre utilisateur. Si vous souhaitez que vos modifications à appliquer, cliquez sur Retour dans votre navigateur Web, actualiser la page, et soumettre à nouveau vos modifications.

avec la trace de la pile de:

Microsoft.SharePoint.SPException a été non gérée par le code utilisateur ErrorCode = -2130575305 NativeErrorMessage = MANQUE hr détectée (hr = 0x81020037)

NativeStackTrace = "" Message = Save Conflict.

Vos modifications en conflit avec celles qui sont faites en même temps par un autre utilisateur. Si vous souhaitez que vos modifications à appliquer, cliquez sur Retour dans votre navigateur Web, actualiser la page, et soumettre à nouveau vos modifications. Source = Microsoft.SharePoint Trace de la pile: à Microsoft.SharePoint.SPGlobal.HandleComException (COMException ComeX) à Microsoft.SharePoint.Library.SPRequest.SetListProps (String bstrUrl, String bstrListName, Boolean bMigrate) à Microsoft.SharePoint.SPList.Update (Boolean bFromMigration) à Company.SharePoint.EventReceivers.ListCreate.CompanyListCreateEventReceiver.ListAdded (propriétés SPListEventProperties) à Microsoft.SharePoint.SPEventManager.RunListEventReceiver (récepteur SPListEventReceiver, SPUserCodeInfo userCodeInfo, propriétés SPListEventProperties, String receiverData) à Microsoft.SharePoint.SPEventManager.RunListEventReceiverHelper (récepteur de l'objet, SPUserCodeInfo userCodeInfo, les propriétés de l'objet, le contexte SPEventContext, String receiverData) à Microsoft.SharePoint.SPEventManager. <> c__DisplayClassc`1.b__6 () à Microsoft.SharePoint.SPSecurity.RunAsUser (SPUserToken UserToken, Boolean bResetContext, le code WaitCallback, objet param) InnerException: System.Runtime.InteropServices.COMException

et les journaux ULS de:

25/02/2011 11: 12: 52,06 w3wp.exe (0x363C) 0x219C SharePoint Foundation General Medium Unknown erreur SPRequest a eu lieu. Plus d'informations: 0x8007047e f35857af-3d3a-462c-86a6-de24d3b3d8d3
25/02/2011 11: 12: 52,06 w3wp.exe (0x363C) 0x219C SharePoint Foundation générale 72k4 moyen 0x8007047e f35857af-3d3a-462c-86a6-de24d3b3d8d3
25/02/2011 11: 12: 52,06 w3wp.exe (0x363C) 0x219C SharePoint Foundation générale 8kh7 haute 0x8007047e f35857af-3d3a-462c-86a6-de24d3b3d8d3

Est-il possible d'assurer le conflit ne se produit pas, ou d'une manière différente de la fixation ou l'accès aux propriétés de la liste qui ne conflit. J'ai fatigué création d'une instance séparée de SPSite / SPWeb, mais qui a toujours le même problème.

Un exemple simple du code qui échoue est:

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

        }
}

Toute aide serait appréciée. Merci!

Était-ce utile?

La solution

Vous devez vous enregistrer l'événement ItemAdded comme événement synchrone. SPEventReceiverSynchronization.Synchronous

Vous pouvez définir par programmation: http://msdn.microsoft.com/en-us/library/microsoft. sharepoint.speventreceiverdefinition.synchronization.aspx

Ou dans l'élément récepteur de la définition de fonction: http://msdn.microsoft.com/en-us/library/ff512765.aspx

Autres conseils

Je me bats avec les récepteurs d'événements SharePoint depuis un certain temps. Beaucoup de pièges et de la logique inattendue dans cette partie de SharePoint imo.

Je n'ai pas vu exactement ce problème avant, mais je ne peux vous donner une suggestion de toute façon. Dans mon expérience, changer la liste des propriétés peut parfois avoir des problèmes. Voilà pourquoi je veux obtenir la liste à partir du Web à la place. Si cela échoue (il a travaillé pour moi), essayez instancier une nouvelle SPWeb de Web.Url ainsi.

Dans ce cas, je suggère que vous essayez l'approche suivante:

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

Je suppose que, vous devrez peut-être spécifier « synchrone » dans votre fichier element.xml, reportez-vous http://sharepointconnoisseur.blogspot.com/2011/04/save-conflict-error-when-creating-list.html

Essayez d'utiliser l'événement désactiver et activer les méthodes d'événement.

2) (utile dans la mise à jour du numéro de gestionnaire d'événement)

Item[FieldName] = FieldValue;
this.DisableEventFiriing();
item.SystemUpdate(false);
or
item.Update();
this.EnableEventFiring();
//must enable event firing if we are disable it
Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top