您好,我正在尝试获取列表项,想知道这是否是一个好的做法。

   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 最佳实践.

许可以下: CC-BY-SA归因
scroll top