[轉]SharePoint開發中可能用到的各類Context(上下文)

SharePoint是一個B/S結構的產品,因此在開發過程當中會使用到各類各樣的上下文(Context)信息,藉此機會來總結一下。特別是Javascript的Ctx很是實用,這裏記錄一下!javascript

1、HttpContextjava

這個……我想就不用再介紹了,SharePoint運行在標準的ASP.NET框架下(2003用的不是標準的ASP.NET 1.1,不過這年頭還有人用2003麼),因此這個對象的使用和ASP.NET沒有任何區別。web

 

2、SPContext數組

從名字就能夠看出來,這個是SharePoint本身的上下文對象,它除了封裝了HttpContext以外,提供了不少和SharePoint相關的上下文信息。瀏覽器

SPContext包含一個咱們最常用的靜態屬性:SPContext.Current,用於獲取當前的上下文信息(和HttpContext.Current相似,若是程序是運行在Web上的,就可使用這個)。我見過很多初學SharePoint開發的人,在寫WebPart的時候,還在使用new SPSite的方式來獲取當前網站集,這即沒有必要,也是對服務器資源的浪費(SPSite、SPWeb對象都包含非託管資源,而Current中的Site和Web是被SharePoint本身的運行時環境所管理的,能夠快速取用)。服務器

下面看一下這個SPContext中包含哪些經常使用的屬性,能夠在開發過程當中使用(有些屬性其實內部邏輯很複雜,這裏簡要介紹一些基本場景):框架

屬性 說明
Site SPSite類型,次經常使用到的屬性,當前的網站集
Web SPWeb類型,最經常使用到的屬性,當前的網站。 
不少程序都是用SPContext.Current.Web來開頭的……
List / ListId SPList / Guid類型,當前列表。 
不論你是在列表的視圖頁面上、表單頁面上仍是設置頁面上,均可以經過這個屬性取得當前的列表。其實只要Url查詢裏面有一個有效的List參數,參數的值是列表的Guid就能夠。
ListItem / ItemId SPListItem / Int32類型,當前的列表條目。 
通常用於列表的查看和編輯表單(固然新建表單其實也能夠,只不過沒有ID),或者用於獲取存放在頁面庫裏的當前頁面對應的條目。此外,若是當前的List屬性有效的話,只要Url查詢裏面有一個有效的ID參數,就可使用這個屬性獲得對應條目。
ListItemVersion SPListItemVersion類型,當前列表條目對應的版本。 
若是是從歷史版本查看頁面中,查看某個版本的條目時,在那個查看頁面,能夠用這個屬性直接取到相應的版本。
ListItemDisplayName / 
ListItemServerRelativeUrl
string / string類型,當前條目的顯示名稱(若是是普通列表,就是Title字段的值;若是是文檔庫,就是不帶擴展名的文件名;或者是文件夾名稱),以及Url。
File SPFile類型,若是當前條目是一個文件的話,這個屬性能夠直接獲得文件對象。 
至關於SPContext.Current.ListItem.File
RootFolderUrl string類型,當前視圖對應的Url地址。 
若是當前列表視圖是處於列表的某個子文件夾中,能夠經過這個屬性獲得這個文件夾的地址;不然的話,就是當前列表的根文件夾地址。
IsPopUI Boolean類型,判斷當前頁面是否在對話框中。 
僅限SharePoint 2010那種對話框,不包括瀏覽器的那種模態對話框。
FormContext SPFormContext類型,當前列表表單上下文(用於列表表單頁面) 
通常可使用這麼幾個屬性: 
    FormMode:表單類型,New / Edit / Display 
    FieldControlCollection:表單上字段控件的集合
ViewContext SPViewContext類型,當前視圖上下文(用於列表視圖頁面) 
通常可使用這麼幾個屬性: 
    View:SPView對象,當前的視圖 
    ViewId:視圖的Guid
ContextPageInfo SPContextPageInfo類型,當前頁面上下文(用於頁面庫中的頁面) 
通常可使用這麼幾個屬性: 
    ListId:頁面所在文檔庫的Id 
    ItemId:當前頁面做爲列表條目的Id 
    BasePermissions:當前用戶對當前頁面的權限 
    IsWebWelcomePage:當前頁面是不是網站的首頁

 

3、JavaScript中的「ctx」網站

這個在微軟的SDK裏面是沒有說起到的,在全部包含列表視圖的Web部件頁上,每一個列表視圖都會對應一個ctx[blabla]的JavaScript變量,後面那個[blabla]是一個數字,這個數字也是這個變量的ctxId屬性。這些ctx變量都放在一個全局JavaScript變量g_ctxDict這個對象中,其key就是變量名字符串,value就是這個變量,所以便利這個全局變量,就能經過JavaScript找到當前頁面中的全部視圖。ui

ctx變量名義上是一個叫ContextInfo的JavaScript「類」,它包含很是豐富的屬性,經常使用的一些以下:spa

屬性 說明
ctxId 一個標識此變量的數字,好比185,那麼這個變量就是ctx185。使用的時候能夠用ctx185或者g_ctxDict[‘ctx185’]來找到這個變量(某些狀況下有種更簡便的方法,後面再說)。須要注意的是,每次刷新頁面的時候,這個標識多是會變的,具體原理我暫時木有去深究。
listBaseType 列表的基礎類型,至關於SPList的BaseType屬性
listTemplate 列表的模版Id(好比文檔庫是10一、通知是104),至關於SPList的BaseTemplate屬性
listName 列表的Id,不要被變量名混淆了
view 列表視圖的Id
listUrlDir 列表的根路徑,至關於spList.RootFolder.ServerRelativeUrl
HttpRoot 當前網站的根路徑(絕對路徑)
SiteTitle 當前網站的標題
ListTitle 列表的標題(這個纔是標題,listName不是)
CurrentUserId 當前用戶的Id
wpq[*] 渲染視圖那個WebPart的ID,好比WPQ2
ListData[*] 這個就厲害了,這個屬性指向一個數組,而這個數組就是當前視圖顯示的那些列表條目,包含各個字段的值,JSON格式。
ListSchema[*] 列表各個字段的定義(包含字段名稱、字段類型等等),JSON格式。
BasePermissions[*] 當前用戶對這個列表的基本權限,形以下面這種樣子: 
{ManageLists: true, ManagePersonalViews: true, OpenItems: true}

後面加[*]的那幾個是SharePoint 2013新增的屬性。

其實在包含列表視圖的頁面中,還有一個名字就叫「ctx」的變量,它指向這個頁面中最後一個ctx[blabla]變量,所以若是頁面中只有一個列表視圖的話,就能夠直接使用ctx。好比在某個列表視圖頁面中,你想看一下這個列表模版的Id是多少,就能夠直接在瀏覽器地址欄裏輸入:javascript:alert(ctx.listTemplate) ,嗯。

ctx變量最主要的做用,就是生成列表項的那個下拉菜單(ECB – Edit Control Block),若是你去翻那個corev4.js的話,就能夠看到在建立那個下拉菜單的時候,ctx是做爲參數傳進去的。若是須要自定義列表項菜單的話,除了使用Feature的方式、或者2010新增的那個經過SPD添加Custom Action的方式,還可使用從2007時代延續下來的JavaScript方式:在頁面中添加Custom_AddListMenuItems方法或者Custom_AddDocLibMenuItems方法(具體使用請自行搜索),而ctx就是這兩個方法的參數之一。

除此以外,做爲列表視圖中重要的JavaScript變量,經過在頁面中嵌入的一些腳本中使用ctx,還能夠完成各類比較邪惡的事情,請你們自行發揮想象。

 

4、JavaScript中的_spPageContextInfo變量

一樣是一個沒有文檔的JavaScript變量,雖然名字和前面提到的某個服務器端類型差很少,可是這個JavaScript變量裏面所包含的內容,要比SPContextPageInfo多不少,它包含以下一些經常使用屬性:

屬性 說明
webServerRelativeUrl 網站的相對服務器路徑(「/」開頭)
currentLanguage 當前網站的語言LCID
webUIVersion 當前網站的UI風格(2010/2013風格是4,若是母板頁是2007風格是3)
pageListId 頁面庫的列表Id
pageItemId 若是當前頁面是在頁面庫中的話,當前頁面做爲列表條目的Id
webAbsoluteUrl[*] 網站絕對路徑(「http://」或者「https://」開頭)
siteAbsoluteUrl[*] 網站集絕對路徑(「http://」或者「https://」開頭)
layoutsUrl[*] layouts的相對服務器路徑(2013其實有兩個layouts root路徑,一個是15,一個是14)
webTitle[*] 網站標題
webPermMasks[*] 當前用戶對當前網站的權限,形如:{High:2147483647,Low:4294967295} 
(由於JavaScript不支持64位整數,因此把高位和地位拆開了)
siteServerRelativeUrl[*] 網站集的相對服務器路徑(「/」開頭)

後面加[*]的那幾個是SharePoint 2013新增的屬性。

_spPageContextInfo變量主要的使用場景,就是在JavaScript中獲取當前頁面的一些基本信息,尤爲在發佈頁面中,會有比較多的使用價值。

 

5、其餘JavaScript全局變量

頁面中其實還有一些全局的JavaScript變量,也能夠獲取到當前的一些上下文信息:

 

變量 說明
g_wsaLCID 當前的語言,至關於_spPageContextInfo.currentLanguage
g_wsaSiteTemplateId 當前網站所使用的站點模版,好比「STS#1」表示工做組網站
_spUserId 當前用戶的Id,這個JavaScript變量實際上是右上角那個歡迎菜單渲染出來的
_spWebPermMasks 當前用戶對當前網站的權限,至關於_spPageContextInfo.webPermMasks
相關文章
相關標籤/搜索