Question

Bonjour, je suis en train de chercher un élément de la liste et que vous voulez savoir si c'est une bonne pratique.

   SPSite spsite = new SPSite(SPContext.Current.Web.Url);
                    SPWeb spWeb = spsite.RootWeb;
                    SPList spList = spWeb.Lists.TryGetList("MyList");
//here is the code to fetch the values...

Nous avons 1 de la collection de sites avec 50 sous-sites et plusieurs sous-sites à l'intérieur de eux.Ma question est;

Supposons que je suis sur l'une des sous-sites en vertu de la sous-site numéro 10 et ce code est exécuté, puis encore de ramassage de la racine web de la liste ou de donner de l'erreur?

Je suis confus parce que la valeur de la SPContext.Actuel.Web.Url est l'URL actuelle à l'emplacement respectif.Ensuite, le code fonctionne encore?

Était-ce utile?

La solution

Votre création d'un nouveau site qui n'est pas disposé, SPContext.current.web.url ne génère que l'URL de la chaîne.

Correction correcte:

   using (SPSite spsite = new SPSite(SPContext.Current.Web.Url))
   {
        SPWeb spWeb = spsite.RootWeb;

        SPList spList = spWeb.Lists.TryGetList("MyList");
   }

Il n'est pas nécessaire de disposer du SPWEB comme vous l'avez noté, il n'y a pas de nouveau.Son utilisation du nouvel objet Web SPSITE.Si vous le disposez, cela conduirait à des erreurs sur ULS:

Utilisation détectée de Sprequest pour un objet SPWeb précédemment fermé.S'il te plaît Fermer les objets SPWeb lorsque vous avez terminé avec tous les objets obtenus de eux, mais pas avant.

Une autre façon d'utiliser le code serait:

SPWeb spWeb = SPContext.Current.Site.RootWeb;
SPList spList = spWeb.Lists.TryGetList("MyList");

Comme vous pouvez le constater, il n'est pas nécessaire de disposer de son utilisation de l'objet rootweb de site actuel qui ne devrait pas être éliminé et moins de ressources de code / système!

Autres conseils

Comme l'a souligné @Robert, il va de ramassage de la racine web.Cependant, vous n'avez pas besoin de disposer SPWeb objet récupéré à partir de SPSite.RootWeb de la propriété.Vous pouvez également obtenir directement le SPSite objet de SPContext SPSite spsite = SPContext.Current.Site; et donc n'a pas besoin d'être éliminés au lieu d'instancier une nouvelle qui doit être explicitement disposé.

Il ramassera la rootweb.

Mais n'oubliez pas de disposer du spsite lorsque vous avez terminé, sinon à l'aide d'une "déclaration en utilisant":

spsite.Dispose()

Vous pouvez utiliser SPContext.Current.Site.Url, lors de la création d'objet SPSite à l'intérieur de votre code,puis utilisez site.OpenWeb(), qui donnera à la racine web(depuis SPSite objet est créé avec l'URL du Site).Toujours préférable d'utiliser using pour l'élimination des objets.

using (SPSite site=new SPSite(SPContext.Current.Site.Url))
            {
                using(SPWeb web=site.OpenWeb())//always gets you the root web
                {

                }
             }

Voir ce blog SPDisposeCheck les meilleures pratiques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top