Pergunta
Olá eu estou tentando buscar um item da lista e gostaria de saber se esta é uma boa prática.
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...
Temos 1 conjunto de sites com 50 subsites e mais subsites dentro deles.A minha pergunta é;
Suponha que eu estou em um dos subsites sob subsite número 10, e este código é executado, então será ainda de captação de raiz da web de lista ou dar erro?
Estou confuso, pois o valor da SPContext.Atual.Da Web.Url a URL atual no local respectivo.Então, o código ainda funciona?
Solução
a sua criação de um novo site que não é descartado, SPContext.Atual.Da Web.Url apenas gera a seqüência de caracteres de url.
maneira correta:
using (SPSite spsite = new SPSite(SPContext.Current.Web.Url))
{
SPWeb spWeb = spsite.RootWeb;
SPList spList = spWeb.Lists.TryGetList("MyList");
}
não há necessidade de dispor de spweb como você observou nada há que seja novo.Sua usando o novo spsite um objeto da web.Se você dispor iria levar a erros na uls:
Detectado o uso de SPRequest anteriormente fechado objeto SPWeb.Por favor fechar objetos SPWeb quando você é feito com todos os objetos obtidos a partir de eles, porém, não antes.
outra maneira de usar o código seria:
SPWeb spWeb = SPContext.Current.Site.RootWeb;
SPList spList = spWeb.Lists.TryGetList("MyList");
como você pode ver, não há necessidade de descarte como a sua utilização do site atual rootweb objeto que não deve ser descartado e menos código/ recursos do sistema!
Outras dicas
Como apontado por @Robert, ele vai pegar a web de raiz.No entanto, você não precisa descartar SPWeb
objeto obtido a partir da SPSite.RootWeb
propriedade.Você também pode obter diretamente a SPSite
objeto de SPContext SPSite spsite = SPContext.Current.Site;
e, portanto, não precisam ser eliminados em vez de instanciar uma nova, que precisa ser explicitamente eliminados.
Ele vai pegar a RootWeb.
Mas por favor, lembre-se de descartar o spsite quando você é feito, se não estiver usando um "utilizando-declaração":
spsite.Dispose()
Você pode usar SPContext.Current.Site.Url
, ao criar o objeto SPSite dentro de seu código,em seguida, usar site.OpenWeb()
, o que dará a web de raiz(desde SPSite objeto é criado com a URL do Site).Sempre melhor usar using
para descartar objetos.
using (SPSite site=new SPSite(SPContext.Current.Site.Url))
{
using(SPWeb web=site.OpenWeb())//always gets you the root web
{
}
}
Ver sobre este blog SPDisposeCheck melhores práticas.