Pregunta

Hola, estoy intentando recuperar un elemento de la lista y quiero saber si es una buena práctica.

   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...

Tenemos 1 colección de sitios con 50 subsitios y más subsitios dentro de ellos.Mi pregunta es;

Supongamos que estoy en uno de los subsitios bajo el subsitio número 10 y se ejecuta este código, ¿aún recogerá la lista web raíz o dará un error?

Estoy confundido porque el valor de SPContext.Current.Web.Url será la URL actual en la ubicación respectiva.Entonces, ¿seguiría funcionando el código?

¿Fue útil?

Solución

La creación de un sitio nuevo que no está dispuesto, SPCONTEXT.CURRENT.WEB.URL solo genera la URL de cadena.

forma correcta:

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

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

No hay necesidad de disponer del SPWEB como usted señaló que no hay nada nuevo.Está utilizando el nuevo objeto web SPSITE.Si lo dispone, lo llevaría a errores en ULS:

Uso detectado de SPREQUEST para el objeto SPWEB cerrado previamente.Por favor Cerrar objetos SPWEB cuando haya terminado con todos los objetos obtenidos de ellos, pero no antes.

Otra forma de usar el código sería:

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

Como puede ver, no es necesario deshacerse de su uso del objeto RootWeb del sitio actual que no se debe eliminar y menos recursos de código / sistema!

Otros consejos

Como señaló @Robert, recogerá la web raíz.Sin embargo, no es necesario deshacerse SPWeb objeto recuperado de SPSite.RootWeb propiedad.También puedes obtener directamente el SPSite objeto de SPContext SPSite spsite = SPContext.Current.Site; y por lo tanto no es necesario eliminarlo en lugar de crear una instancia nueva que deba eliminarse explícitamente.

recogerá el rootweb.

Pero recuerde disponer el SPSITE cuando haya terminado, si no está utilizando un "Uso de la declaración":

spsite.Dispose()

Puedes usar SPContext.Current.Site.Url, mientras crea el objeto SPSite dentro de su código, luego use site.OpenWeb(), que proporcionará la raíz web (ya que el objeto SPSite se crea con la URL del sitio).Siempre es mejor usar using para deshacerse de objetos.

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

                }
             }

Vea este blog sobre SPDisposeCheck mejores prácticas.

Licenciado bajo: CC-BY-SA con atribución
scroll top