有了上一篇的鋪墊 Sharepoint學習筆記—ECMAScript對象模型系列--1、ECMAScript對象模型的引入,我們接下來看看如何利用ECMA來操作Sharepoint網站。
事實上在上一篇文章里我們已經在對網站進行操作了,我們提取了網站對象的Title與Description信息,並對網站的Title並進行了修改。
我們知道,若要通過 ECMAScript(JavaScript、JScript)使用網站,應首先使用 ClientContext(serverRelativeUrl) 構造函數並傳遞 URL 或 URI 以返回特定請求上下文。使用 ClientContext 類的 web 屬性指定位於指定上下文 URL 處的網站對象的屬性。通過 load(clientObject) 方法加載網站對象,然后調用 executeQueryAsync(succeededCallback, failedCallback) 后,將會獲取對該網站的所有屬性的訪問權限。
但由於Sharepoint網站對象有許多屬性,我們並不知道用戶確切需要哪些屬性,他們可能只需要其中的2、3個或幾個,而對此我們返回所有屬性就顯然會加重數據傳輸的負擔。因此,若要減少客戶端和服務器之間不必要的數據傳輸,我們只需要返回網站對象的指定屬性,而不是返回其所有屬性。在這種情況下,可將 LINQ 查詢或 lambda 表達式語法與 load(clientObject) 方法結合使用,以指定從服務器返回哪些屬性。
一、 下面我們就使用Load方法,指定返回網站的Title與Created兩個屬性。
繼續接着上文創建的項目進一步操作,在同一個Visual Web Part中,添加按鈕,並定義此按鈕的客戶端事件,如下 :
// Retrive Website Properties
var siteUrl = ' / ' ;
function retriveWebSiteProperties() {
var clientContext = new SP.ClientContext(siteUrl);
// var clientContext= new SP.ClientContext.get_current();
this .oWebsite = clientContext.get_web();
clientContext.load( this .oWebsite, ' Title ' , ' Created ' ); // Load the specific properties of website object
clientContext.executeQueryAsync(Function.createDelegate( this , this .onQuerySucceededProperties),
Function.createDelegate( this , this .onQueryFailedProperties));
}
function onQuerySucceededProperties(sender, args) {
alert( ' Title: ' + this .oWebsite.get_title() + ' Created: ' + this .oWebsite.get_created());
// alert('Title');
}
function onQueryFailedProperties(sender, args) {
alert( ' Request failed. ' + args.get_message() + ' \n ' + args.get_stackTrace());
// alert('Failed');
}
</ script >
執行效果如下:
二、此處,我們進一步看看如何使用ECMA來創建一個Website。
還是在同一個項目中,創建按鈕及其客戶端事件。
var currentcontext = null ;
var currentweb = null ;
var blogDescription = ' This site created from ECMA script ' ;
var blogLanguage = 1033 ;
var blogTitle = ' ECMA Script created site ' ;
var blogUrl = ' ECMAScriptSite ' ;
var blogPermissions = true ;
var webTemplate = ' STS#0 ' ;
function CreateSiteByECMA() {
currentcontext = new SP.ClientContext.get_current();
currentweb = currentcontext.get_web();
var webCreateInfo = new SP.WebCreationInformation();
webCreateInfo.set_description(blogDescription);
webCreateInfo.set_language(blogLanguage);
webCreateInfo.set_title(blogTitle);
webCreateInfo.set_url(blogUrl);
webCreateInfo.set_useSamePermissionsAsParentSite(blogPermissions);
webCreateInfo.set_webTemplate(webTemplate);
this .NewWebsite = this .currentweb.get_webs().add(webCreateInfo);
currentcontext.load( this .NewWebsite, ' ServerRelativeUrl ' , ' Created ' );
currentcontext.executeQueryAsync(Function.createDelegate( this , this .ExecuteOnSuccessCreateSite),
Function.createDelegate( this , this .ExecuteOnFailureCreateSite));
}
function ExecuteOnSuccessCreateSite(sender, args) {
alert( " Web site url : " + this .NewWebsite.get_serverRelativeUrl());
}
function ExecuteOnFailureCreateSite(sender, args) {
alert( ' Site cannot be created ' );
}
</ script >
執行效果如下:
驗證網站是否創建成功:
三、使用ECMA來遍歷指定Website下的Sub Websites
直接上代碼
var currentcontext = null ;
var currentweb = null ;
function EnumerateThroughSite() {
currentcontext = new SP.ClientContext.get_current();
currentweb = currentcontext.get_web();
this .subsites = currentweb.get_webs();
// this.sitecoll = currentcontext.get_site(); //to get top level site - just for information
currentcontext.load( this .subsites);
currentcontext.executeQueryAsync(Function.createDelegate( this , this .ExecuteOnSuccessEnumerateThroughSite),
Function.createDelegate( this , this .ExecuteOnFailureEnumerateThroughSite));
}
function ExecuteOnSuccessEnumerateThroughSite(sender, args) {
var subsites = '' ;
var groupEnumerator = this .subsites.getEnumerator();
while (groupEnumerator.moveNext()) {
var Site = groupEnumerator.get_current();
subsites += ' \nID: ' + Site.get_id() + ' \nTitle: ' + Site.get_title();
}
alert(subsites);
}
function ExecuteOnFailureEnumerateThroughSite(sender, args) {
alert( " Cannot enumerate " );
}
</ script >
執行效果如下 :