【问题标题】:Sharepoint: How to obtain the current site/web/list properlySharepoint:如何正确获取当前站点/网站/列表
【发布时间】:2010-04-26 17:09:19
【问题描述】:

获取当前站点/网站/列表的最佳方式是什么?

选项 1 - 重用现有对象

        SPSite site = SPContext.Current.Site;
        SPweb web = SPContext.Current.Web;
        SPList list = SPContext.Current.List;

选项 2 - 创建新对象

        SPSite site = new SPSite(SPContext.Current.Site.ID); // dispose me
        SPweb web = site.OpenWeb(SPContext.Current.Web.ID); // dispose me
        SPList list = web.Lists[SPContext.Current.List.ID];

在某些情况下使用选项 1 时遇到问题。从那以后,我选择了第二个选项,到目前为止效果很好。

您对此有何看法?我通常最好选择选项 2?其他建议?

【问题讨论】:

    标签: sharepoint sharepoint-2007


    【解决方案1】:

    请使用选项一,因为它更节省资源,因为您不需要创建新对象(例如 OpenWeb 方法涉及查询数据库来完成它的工作)。但是你不能从 SPContext 中释放对象,这肯定会给你带来麻烦。

    如果您的代码未在应用程序页面(如 SharePoint 计时器或工作流)的上下文中运行,则必须使用选项二,因为 SPContext.Current 对象将为空。

    Link

    是的,如果您打开 SPWeb 或 SPSite 对象,you MUST dispose it

    【讨论】:

    • 选项 1 is 会更高效,但有时您无法使用它(例如,当您想要一个不在当前上下文中的站点时)。我宁愿在所有情况下都使用选项 2,因为它提供了一种一致的做事方式。
    • 你在开玩笑吗?即使没有必要,您也宁愿进行数据库往返?
    • 当然这取决于所讨论的应用程序,但很有可能,是的。性能不是唯一的考虑因素 - 还有可读性、可维护性和安全性(例如,确保正确处置 SharePoint 对象)。你只用汇编编程,还是使用高级语言增加不必要的开销? ;)
    【解决方案2】:

    我通常使用选项 2(我相信这是 Microsoft 推荐的方法),但我倾向于使用 using 包装东西以确保它们被正确处理。示例:

    using (SPSite site = new SPSite("MY SITE URL"))
    {
      using (SPWeb web= site.OpenWeb())
       {
           // Do stuff
       }
    } 
    

    这种方法可以让您明确了解对象的创建和销毁时间。

    【讨论】:

    • 这也是使用 RunWithElevatedPrivileges() 在正确的安全上下文中获取对象时要走的路。
    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多