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 |