题
您好,我正在尝试获取列表项,想知道这是否是一个好的做法。
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...
我们有 1 个网站集,其中包含 50 个子网站以及更多子网站。我的问题是;
假设我位于子站点编号 10 下的子站点之一,并且执行了此代码,那么它是否仍会获取根 Web 列表或给出错误?
我很困惑,因为 SPContext.Current.Web.Url 的值将是相应位置的当前 URL。那么,这段代码还能工作吗?
解决方案
您创建一个未处理的新站点,spcontext.current.web.url仅生成字符串URL。
正确的方式:
using (SPSite spsite = new SPSite(SPContext.Current.Web.Url))
{
SPWeb spWeb = spsite.RootWeb;
SPList spList = spWeb.Lists.TryGetList("MyList");
}
.
没有必要在你注意到的时候处理spweb,没有新的。它使用新的spsite web对象。如果您处置它会导致ULS的错误:
检测用于以前关闭的SPWeb对象的spRequest。请 完成从中获得的所有对象时关闭SPWeb对象 他们,但不是之前。
使用代码的另一种方法是:
.SPWeb spWeb = SPContext.Current.Site.RootWeb; SPList spList = spWeb.Lists.TryGetList("MyList");
您可以看到,不需要作为其使用不适用于且少于代码/系统资源的当前站点rootbe对象。
其他提示
正如@Robert 所指出的,它将获取根网络。但是,您不需要处置 SPWeb
对象检索自 SPSite.RootWeb
财产。您也可以直接获取 SPSite
来自 SPContext 的对象 SPSite spsite = SPContext.Current.Site;
因此不需要被处置,而是实例化一个需要显式处置的新实例。
它将拾取rootweb。
但请记得在完成时处理spsite,如果没有使用“使用-陈述”:
spsite.Dispose()
. 您可以使用 SPContext.Current.Site.Url
, ,在代码中创建 SPSite 对象时,然后使用 site.OpenWeb()
, ,这将给出根 web(因为 SPSite 对象是使用站点 URL 创建的)。总是更好用 using
处理物体。
using (SPSite site=new SPSite(SPContext.Current.Site.Url))
{
using(SPWeb web=site.OpenWeb())//always gets you the root web
{
}
}
请参阅此博客有关 SPDisposeCheck 最佳实践.