2010-04-26 75 views
3

獲取當前網站/網頁/列表的最佳方式是什麼?Sharepoint:如何正確獲取當前網站/網頁/列表

選項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?其他建議?

回答

2

我通常選擇2(我相信微軟推薦的方法),但我傾向於使用using來包裝東西,以確保它們被妥善處置。例如:

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

該方法允許您清楚地瞭解何時創建和銷燬對象。

+2

這也是在使用RunWithElevatedPrivileges()獲取正確的安全上下文中的對象時要走的路。 – Flo 2010-04-26 13:30:21

4

請使用選項1,因爲它不需要創建新對象(例如OpenWeb方法涉及到查詢數據庫來完成它的工作),因此更節省資源。但是你不允許從SPContext中處理對象,這肯定會導致你的問題。

如果您的代碼未在應用程序頁面的上下文(如SharePoint計時器或工作流程)中運行,您必須使用選項二,因爲SPContext.Current對象將爲空。

Link

是的,如果你打開SPWeb或SPSite對象,you MUST dispose it

+0

選項1將變得更有效率,但有時您不能使用它(例如,當您想要一個站點不在當前上下文中時)。我更喜歡在所有情況下使用選項2,因爲它提供了一種一致的做事方式。 – Cocowalla 2010-04-26 09:11:48

+0

你在開玩笑嗎?即使沒有必要,你寧願讓數據庫往返一次? – 2010-04-26 20:51:40

+1

當然,這取決於有問題的應用程序,但很可能,是的。性能不是唯一的考慮因素 - 還有可讀性,可維護性和安全性(例如,確保正確處理SharePoint對象)。你只在程序集中編程,還是使用高級語言添加不必要的開銷? ;) – Cocowalla 2010-04-27 10:15:07

相關問題