SharePoint

使用 SharePoint 2013 的 JSLink

Pritam Baldota

與 SharePoint 使用者介面的工作一直是東西開發人員面臨的一個挑戰。 但是,SharePoint 2013 稱為 JSLink 中的新功能減少負載使用 XSLT 的負擔,並提供了一種更容易、 更積極的反應的方法,以在用戶端上顯示自訂欄位。 JSLink 是一個通過 JavaScript 檔控制項的欄位、 項和甚至Web 組件呈現的屬性。

本文將探討使用 JSLink 的説明下兩個演示方案。 第一種方案將演示如何使用顏色編碼的消息以指示完成任務,例如,如中所示圖 1

Using a Custom Column for a Task List to Show Status
圖 1 使用自訂工作清單的列中顯示狀態

第二種情況是更為複雜。 它將演示如何實現一個提供為每個圖像顯示的中繼資料,並允許在不同的解析度,下載一個標注,如中所示的圖像畫廊圖 2

Multiple Resolutions of an Image Available for Download
圖 2 多解析度的圖像可供下載

此外會深入自訂新建和編輯的表單欄位。 在我開始之前,雖然,我就會帶一看 SharePoint 2013 年和 JSLink 將值添加到它在用戶端轉譯的基本知識。

用戶端轉譯

用戶端轉譯是指顯示在頁上使用在用戶端上,如 JavaScript、 HTML 和 CSS 的操作的技術資料。 因為技術在用戶端的瀏覽器中運行,它是更多的回應速度和效率,從而降低 Web 服務器上的負載。 較早版本的 SharePoint 2010 2007年) 使用 XSLT 樣式的元素,一般是更加複雜與工作和在性能與 JavaScript 的比較慢。 SharePoint 2013 仍然支援 XSLT,但仍是自訂結果在用戶端上的兩個附加技術 — — 顯示範本,定義 SharePoint 2013 搜索 Web 組件呈現結果的方式 (見 bit.ly/1i5fM6k 的詳細資訊) 和這篇文章的重點,JSLink 的主題。

JSLink 是一個可以與欄位、Web 組件、 清單形式和內容類型一起使用的屬性。 通過此屬性,您可以添加 JavaScript 檔,開放自訂項的廣泛可能性。 您添加的每個 JavaScript 檔是開頭一個 SharePoint 權杖,像這樣由管道符號 (|) 分隔:~site/style 圖書館 /­mycustom.js|~site/style library/mycustom2.js。 如果 JavaScript 檔不包含任何相關的呈現代碼,則應用預設呈現的元素。

SharePoint 提供幾個權杖 (靜態和動態),可用於構建特定于上下文的 URL。 這裡有一些重要的 SharePoint 權杖動態 URL 施工:

  • ~ 網站 — — 指的是當前 Web 網站的 URL。
  • ~ sitecollection — — 指的是父網站集合的當前 Web 網站的 URL。
  • ~ 佈局 — — 指的是 _layouts/15 在 Web 應用程式。
  • ~ sitecollectionlayouts — — 指的是佈局資料夾中當前網站集合 (如 /sites/mysite/_layouts/15)。
  • ~ sitelayouts — — 指的是佈局資料夾中的當前網站 (如網站/mysite/mysubsite/_layouts/15)。

SharePoint 有 URL 建設的多個標記。 若要瞭解有關 URL 字串和權杖的詳細資訊,請參閱在開發中心 bit.ly/1lpYuAP

使用 JSLink 用戶端轉譯具有數目的 XSL/XSLT 的優勢。 首先,它使用 JavaScript,大多數 Web 開發者已經是舒適。 XSLT 是更為複雜的開發和調試,因此,JSLink 可以減少開發時間不損失精度。

呈現上使用 JavaScript、 HTML 和 CSS 的用戶端視圖可以避免不必要的負載在伺服器上,提高了總體性能和減少頁面回應時間。 用戶端處理使 UI 回應度很高。

此外,您可以自訂視圖中使用 JSLink 的全部或部分。 例如,如果您想要自訂只是一個特定的欄位,您可以定制為該欄位只 ; 呈現邏輯 將使用預設的邏輯呈現視圖的其餘部分。 通過 JSLink,你可以使用任何有效的 JavaScript,包括外部外掛程式 jQuery,如與 HTML 和 CSS 的組合。

當然,每一項技術有一些缺點,JSLink 也是如此。 例如,如果使用者有被阻止在他的瀏覽器的 JavaScript,JSLink 將不會工作。 伺服器端呈現與 XSLT 仍將顯示相同的體驗,但是性能可能會受到影響。

如果使用者的瀏覽器或系統是舊的或動力不足 (因為它可能要花更多的時間來執行該腳本,也可能受到影響的性能。

最後,編目程式不太可能理解 AJAX/JavaScript ; 生成的動態內容 他們需要用 HTML 呈現的靜態資料。 所以,如果你有一個面向公眾的網站,JSLink 可能不是您的最佳選擇。

可以以多種方式使用伺服器物件模型、 Windows PowerShell、 Element.xml 通過功能、 Web 組件屬性視窗中和用戶端物件模型設置的 JSLink JavaScript 檔引用。 下面是一些示例代碼,每種方法。

伺服器物件模型:若要設置 JSLink 屬性的說,清單表單,您訪問使用的清單表單集合的 SPForm 物件,然後將 JSLink 屬性設置為 SPForm 物件:

SPWeb web = SPContext.Current.Web;
SPList list = web.Lists.TryGetList("MyTasks");
if (null != list)
{
  SPForm newForm = list.Forms[PAGETYPE.PAGE_NEWFORM];
  if (null != newForm)
  {
    newForm.JSLink = "~/mycustom.js";
  }
}

Windows PowerShell:若要設置的 JSLink 屬性,例如,自訂欄位的清單,你訪問欄位物件使用此清單中的欄位集合,然後將 JSLink 屬性設置為該欄位物件:

$web = Get-SPWeb
$field = $web.Fields["MyCustomField"]
$field.JSLink = "~/layouts/mycustom.js"
$field.Update()
$web.Dispose()

Element.xml 檔:要設置 JSLink 屬性的自訂欄位的清單,您將某一欄位節點添加到 Element.xml 檔:

<Field ID="{eb3eed37-961b-41bd-b11c-865c16e47071}"
Name="MyCustomField" DisplayName="Custom Columns"
Type="Text" Required="FALSE" Group="JSLink Demo"
JSLink="~site/style library/JSLinkDemo/jquery-1.10.2.min.js|
~site/style library/JSLinkDemo/customview.js">
</Field>

請注意通過使用管道符號,您可以添加多個 JavaScript 檔。

Web 組件屬性對話方塊中:若要設置 JSLink 屬性的 Web 組件,您可以修改其屬性。 轉到 Web 組件 |編輯屬性 |雜項和設置 JSLink 屬性。

用戶端物件模型 (CSOM):您可以設置欄位使用 CSOM 的 JSLink。 請注意不能直接更新通過 JavaScript 的網站列屬性,您需要更新它使用關聯清單欄位。 如果您嘗試更新網站列級別,您將收到此錯誤:

此功能不可用於不與清單相關聯的欄位...

 

此代碼演示如何正確地更新通過 JavaScript CSOM 清單中的欄位的 JSLink 屬性:

fieldCollection = taskList.get_fields();
this.oneField = fieldCollection.getByInternalNameOrTitle("MyCustomField");
this.oneField.set_description("MyNewFieldDescription");
this.oneField.update();

此示例的詳細資訊,請參閱 MSDN 文檔在 bit.ly/1i9rlZR

為了使用 JSLink,您需要重寫此方法的自訂 JavaScript 檔中:

SPClientTemplates.TemplateManager.RegisterTemplateOverrides()

此方法需要一個範本物件傳遞給它。 若要定義的範本物件,必須指定一個屬性和為每個視圖 (如查看、 添加和編輯) 的 render 方法。

註冊方法的範本物件具有屬性,如標題、 正文、 頁腳、 OnPreRender、 OnPostRender、 組、 專案和欄位,可以利用來重寫預設的視圖的呈現邏輯。 例如,若要修改視圖、 顯示、 編輯和新的自訂欄位,您可以提供範本物件的欄位屬性的以下資訊:

siteCtx.Templates.Fields = {
  // MyCustomField is the Name of our field
  'MyCustomField': {
  'View': customView,
  'DisplayForm': customDisplayForm,
  'EditForm': customNew,
  'NewForm': customEdit
  }
};

在此代碼中,如自訂視圖和 customDisplayForm,引用的方法包含此欄位的實際呈現邏輯。

最後,調用 RegisterTemplateOverrides 方法的 TemplateManager 要應用自訂的視圖,就像這樣:

 

// Register the template to render custom field
SPClientTemplates.TemplateManager.RegisterTemplateOverrides(siteCtx);

此方法會照顧餘生的基於您的自訂邏輯視圖的呈現。

請記住當您使用同一頁上的多個實例的清單視圖 Web 組件並將 JSLink 應用於其中一個實例,所有其他清單的佈局查看Web 組件的更改也,因為在內部 SharePoint 使用共同呈現邏輯。 若要避免此問題,您需要確保的 BaseViewID 值不會與現有 ViewIDs 發生衝突,所以重寫,例如,環磷醯胺之前更改上下文的 BaseViewID 屬性。BaseViewID = 1000年。

現在我送你兩個示範方案通過。

方案 1:顯示顏色編碼的任務完成狀態

這種情況下顯示任務完成狀態使用顏色編碼為一個工作清單 — — 紅色為未完成的任務和綠色為已完成的任務。

在示例中,我將自訂的視圖範本的自訂欄位,如下所示:

// View Page custom rendering
function customView(ctx) {
if (ctx != null && ctx.CurrentItem != null) {
  var percentCompete = parseInt(ctx.CurrentItem.PercentComplete);
  if (percentCompete != 100) {
    return "<span style='color:red'>Incomplete Task</span>";
  }
  else {
    return "<span style='color:green'>Task Completed</span>";
  }
}
}

自訂視圖方法接收當前渲染上下文作為輸入參數從 SharePoint 的內部。 此輸入的上下文有很多其他與相關的屬性清單、 視圖、 當前專案等等。

上下文的 currentItem 屬性使訪問清單中的當前行專案。 通過此屬性,您可以訪問所有欄位清單中的可用。 請注意是否該欄位不是所選視圖中的可用,你將得到錯誤,訪問該欄位值時。

若要開始,請打開Visual Studio2013年並選擇 SharePoint 2013 空專案。

步驟 1:從添加新項功能表中,將一個網站欄添加到空專案。 若要創建網站列,添加欄位資訊在 Element.xml 檔中,如中所示圖 3。 正如您所看到的 JSLink 屬性引用兩個 JavaScript 檔:JQuery 庫和自訂視圖 JavaScript 檔從樣式庫。 請注意從左至右 (依賴檔應首先引用) 應保持檔的層次結構。

引用的 JavaScript 檔圖 3

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/"> 
  <Field
    ID="{eb3eed37-961b-41bd-b11c-865c16e47071}"
    Name="MyCustomField"
    DisplayName="Custom Columns"
    Type="Text"
    Required="FALSE"
    Group="JSLink Demo"
    JSLink="~site/style library/JSLinkDemo/jquery-1.10.2.min.js|
            ~site/style library/JSLinkDemo/customview.js">
  </Field>
 
</Elements>

步驟 2:添加另一個新專案,一個腳本模組,以存儲自訂 JavaScript 和其他資源檔。

步驟 3:JQuery 庫添加到腳本模組。 創建一個新的 JavaScript 檔,稱為 CustomView.js。

步驟 4:重命名預設的功能從功能 1 到 JSLinkDemo,或創建一個新功能,包括網站列和腳本模組。 將範圍設置為網站,因為它是將部署的網站欄。

步驟 5:部署方案。 您部署解決方案後,您就會看到通過轉到網站設置添加到網站的列的列 |網站欄。

步驟 6:創建工作清單,由從網站內容頁中添加一個應用程式調用 MyTasks。

步驟 7:將自訂的列添加到 MyTasks 清單中,從功能區上清單設置功能表。

步驟 8:添加自訂的列,如使用步驟 1 到 5 的從現有網站欄清單設置頁上按一下添加創建的。 篩選使用 JSLink 演示的組,選擇自訂列和將它添加到清單中。

這樣就完成了第一種方案,其中顯示了任務的完成狀態的執行情況。 正如你可以看到在圖 1,自訂狀態會顯示為任務已完成在綠色或不完整任務中紅。

方案 2:創建自訂圖像庫與標注

在這種情況下我會自訂要在自訂表格格格式,帶有標注要下載多個解析度的圖像中顯示的內置的圖像畫廊呈現。

為此,我自訂的項、 頁眉和頁腳範本欄位的屬性。 下面的代碼設置的第一步:

(function () {
  var overrideContext = {};
  overrideContext.ListTemplateType = 109;
  overrideContext.Templates = {};
  overrideContext.Templates.Item = customItem;
  SPClientTemplates.TemplateManager.RegisterTemplateOverrides(overrideContext);
})();
 
function customItem() {
  return "ItemRow";
}

我已經將 ListTemplateType 設置為 109,SharePoint PictureLibrary 作為預定義了。 (你會發現所有預定義的清單範本類型在 SharePoint 2013 年 bit.ly/1qE8UiY.)此代碼將呈現行與從 customItem 方法返回的文本。

現在,我會將靜態文本替換圖像 (標題、 URL 和其他欄位),開始呈現圖像的實際屬性。 若要替換預設新圖片連結和標題的列,就會自訂的頁眉和頁腳的屬性來設置一些 HTML 文本:

overrideContext.Templates.Header = "<b>Custom Image Gallery View</b>";
overrideContext.Templates.Footer = "<b>Custom Footer</b>";
function customItem() {
  return "<br /><img src='" + ctx.CurrentItem.FileRef +
  "' width='190' height='190' />;
}

我想要以表格格式顯示圖像。 要這樣做,有的佈局在 customItem 方法中添加一些 CSS 和 HTML。 首先,我將空 div 容器添加到頁眉範本,將稍後用於保存專案和頁腳呈現的實際資料。 在範圍內的專案呈現創建動態 HTML 並將它存儲在一個全域變數。 在頁腳呈現範本中,我將動態資料分配到 div 容器。 圖 4 顯示的完整的代碼來呈現一個表格格式圖像廊。

圖 4 中以表格的形式顯示的圖像

function customItem(ctx) {
  // Grid contains 4
  if (ctx.CurrentItemIdx % 4 == 0) {
    // Start new row
    tableData+= "<div style='clear:both'></div>"
  }
 
  tableData += "<div style='margin:5px;border:1px solid #666;float:left;"+
  "width:100px;height:100px' onmouseover=\""+
  "ShowCallout(this,'" + ctx.CurrentItem.Title + "','" +
  ctx.CurrentItem.FileDirRef + "','" + ctx.CurrentItem.FileLeafRef
  + "');\"><img src='" + ctx.CurrentItem.FileRef +
  "' width='100' height='100' /></div>";
 
return "";
}
 
// Custom Footer Method
function customFooter(ctx) {
  // Append Dynamic-generated data to container div
  $("#customImageGalleryContainer").html(tableData);
  return "";
}

現在我想在滑鼠移到每個圖像上顯示標注和顯示附加中繼資料 (如標題、 簡介,等等,同時為下載不同的圖像解析度。 SharePoint 2013 使用 CalloutManager 全域物件提供一個標注框架,通過一個 callout.js JavaScript 檔顯示的上下文資訊。 我會利用這一框架以顯示預設標注。 首先,創建一個自訂的方法調用 ShowCallout 來確定是否有任何現有的開放標注 ; 如果有,我將關閉它們使用來自 CalloutManager 的預設 closeAll 方法:

function ShowCallout(sender, itemId, title, brief, directory, filename) {
  CalloutManager.closeAll();
}

在著手實施之前, 您需要瞭解如何獲得不同解析度的圖像。 在 SharePoint 2013 年,在預設情況下圖像中兩個不同的大小時創建它上載到圖片庫。 例如,如果您上載到庫路徑/imageLibraryName/sample.png,SharePoint 會自動創建一個縮略圖和 Web 大小的圖像:/imageLibrary­Name/_t/Sample_png.jpg 和 /imageLibraryName/_w/­Sample_png.jpg。 在這些 Url,_t 表示縮略圖和 _w 表示 Web 和檔副檔名獲取追加到檔案名以首碼底線 (_) 分隔符號。

ShowCallout 函數使用這些 Url 為原始圖像,以及圖像的不同的決議,並將它們存儲在不同的變數,如下所示 (檔案名和目錄是 ShowCallout 參數):

var fname = filename.replace(".", "_");
var thumbnail = directory + "/_t/" + fname + ".jpg";
var medium = directory + "/_w/" + fname + ".jpg";
var full = directory + "/" + filename;

對於這種情況下我使用 CalloutManager createNewIfNecessary 方法,只有在目標發射點有沒有標注創建標注。 如果有一個標注,則該方法將返回現有的物件引用。 (閱讀更多關於 CalloutManager,訪問 bit.ly/1kXH7uU.)圖 5 顯示的完整代碼,和圖 6 顯示得到的輸出。

圖 5 更新的 ShowCallout 函數

function ShowCallout(sender, itemId, title, brief, directory, filename) {
  // Close fists all callouts if opened
  CalloutManager.closeAll();
  var fname = filename.replace(".", "_");
  var thumbnail = directory + "/_t/" + fname + ".jpg";
  var medium = directory + "/_w/" + fname + ".jpg";
  var full = directory + "/" + filename;
  var calloutContent = "<img src='" + medium + "' width='50%'
    height='50%' /><br/>" +
  brief + " <a href='" + directory + "/Forms/DispForm.aspx?ID=" +
  itemId + "'>View Image</a><br />" +
  "<a href='" + thumbnail + "' target='_blank'>
    Thumbnail</a>  |  " +
  "<a href='" + medium + "' target='_blank'>
    Web Size</a>  |  " +
  "<a href='" + full + "' target='_blank'>Original Size</a>";
 
  var calloutRef = CalloutManager.createNewIfNecessary({
    ID: 'call_' + itemId, launchPoint: sender,
    beakOrientation: 'leftRight', title: title,
    content: calloutContent,
    contentWidth: 610
  });
 
  calloutRef.open();
}

Custom Image Gallery with Callout Showing Metadata
圖 6 自訂圖像畫廊與標注顯示的中繼資料

若要應用自訂呈現,創建網站頁並添加圖像庫清單視圖 Web 組件。 轉到編輯 web 部件屬性對話方塊中,將 JSLink 屬性設置為 ~/site/Style Library/JSLinkDemo/jquery-1.10.2.min.js|~/site/Style 自訂庫/JSLinkDemo/­ImageGallery.js。 按一下應用,並保存頁面。 後刷新頁面,您會看到在所示的畫廊圖 6

可以自訂新和編輯表單欄位用類似的方法,雖然一些變異。 在這裡你需要考慮作為輸入驗證,這種事情存儲輸入欄位中的資料到清單項顯示存儲的資料從一個清單項中輸入的欄位等等。

下一步,我就會看看一個複雜的、 多列的自訂欄位方案的執行細節中所示圖 7

Multi-Column Custom Fields of a List Using JSLink
圖 7 多列的清單使用 JSLink 的自訂欄位

步驟 1:使用 Element.xml 的檔,創建注釋 (下網站列,要說,1000 (或不管適合您的需要) 的設置 NumLines 屬性的文本的自訂欄位。 此自訂的欄位將覆蓋在新建和編輯的表單上呈現。

siteCtx.Templates.Fields = {
  "MyComplexField": {
  'EditForm': customComplexNewOrEdit,
  'NewForm': customComplexNewOrEdit
}
};

對於新查看和編輯都使用相同的 customComplexNewOrEdit 方法。

步驟 2:設置表單上下文,是需要設置的驗證程式,從自訂視圖中讀取值,並將其保存回清單。 若要設置表單上下文你使用 SPClientTemplates.Utility.GetFormCoNtextForCurrentField 方法。 此方法接受作為參數,它由 SharePoint 內部提供呈現的上下文。 下面是一些示例代碼顯示新或編輯自訂呈現器方法:

 

function customComplexNewOrEdit(ctx) {
  if (ctx == null || ctx.CurrentFieldValue == null)
  return '';
 
  var formCtx = SPClientTemplates.Utility.GetFormContextForCurrentField(ctx);
  if (formCtx == null || formCtx.fieldSchema == null)
    return '';
}

步驟 3:在表單上下文後,您需要啟用驗證、 獲取欄位的值,並在適當的欄位中保存的值上從 JSLink 生成的自訂視圖的當前表單中註冊回檔處理常式。 每次使用者按一下保存按鈕在清單表單上,SharePoint 內部調用回檔處理常式附加到使用 formCtx.registerGetValueCallback (filedName,回檔) 的欄位。 此回檔處理常式讀取值從欄位保存到清單項之前:

formCtx.registerGetValueCallback(formCtx.fieldName, function () {
  // Read value from this callback and assign to the field before save
  return "";
});

這是一個空的回檔處理常式。 你有自訂的代碼以便從選定的控制項在表單上讀取的值和傳回值的字串表示形式。

步驟 4:若要添加驗證程式,您需要首先創建要在其中註冊的各個欄位的驗證程式的驗證器容器。 這樣做使用的 SPClientForms.ClientValidation.ValidatorSet 物件。 我可以使用驗證程式容器的 RegisterValidator 方法來註冊多個驗證程式。

您需要註冊錯誤回檔處理常式,以及要顯示的錯誤。 要這樣做,我會使用 registerValidationErrorCallback 方法的表單上下文。 此方法需要兩個參數,HTML 容器元素 (在此示例中的 div) 和 errorResult,ID,則返回從 SharePoint 內部基於驗證失敗。 錯誤訊息將追加到為此方法提供的容器元素。 我需要在我的示例添加一個必填的欄位驗證器和用於驗證的完整代碼所示圖 8

圖 8 驗證代碼

var validatorContainer = new SPClientForms.ClientValidation.ValidatorSet();
if (formCtx.fieldSchema.Required) {
  validatorContainer.RegisterValidator(
  new SPClientForms.ClientValidation.RequiredValidator());
}
 
if (validatorContainer._registeredValidators.length > 0) {
  formCtx.registerClientValidator(
  formCtx.fieldName, validatorContainer);
}
 
formCtx.registerValidationErrorCallback(
  formCtx.fieldName, function (errorResult) {
    SPFormControl_AppendValidationErrorMessage(
    errorContainer, errorResult);
});

步驟 5:您需要添加自訂的 HTML 控制項來表示在新的欄位或編輯頁。 我會有一個文字方塊、 一個下拉清單與另一個清單中的動態值和一個下拉清單中使用靜態值。 我會創建一個表,向表中添加這些控制項並返回 HTML 作為輸出從自訂添加/編輯方法。

為了動態地載入資料,我使用其他 API 讀取另一個清單中的資料,並使用它來填充該清單中的標題。 若要瞭解有關在 SharePoint 中的其餘部分 API 的詳細資訊,請參閱 bit.ly/1cVNaqA

圖 9 顯示動態呈現的輸入的控制項的代碼。

圖 9 呈現的輸入控制項動態

// Render input fields
var inputFields = "<table>";
...
inputFields += "</table>";
 
// Get List data from REST API
$.ajax({
...
success: function (data) {
  // Add options to the dynamic dropdown list
},
error: function (data) {
  // Error handler
}
});
 
 
return inputFields;

步驟 6:要將一個多欄位的值保存到清單中,我將所有欄位的值放入一個字串使用字串的分隔符號,並創建自訂格式 (如 (fieldname:value)(fieldname:value),一種的鍵-值對。 我會做 registerGetValueCallback 的字串建設。

步驟 7:若要編輯表單中顯示的現有值,解析作為一個鍵-值對,保存並將值分配給各自的輸入控制項存儲的字串。 這是使用相同的自訂呈現方法構建自訂 HTML 時完成的。

總結

您可以調試使用基於瀏覽器的開發人員工具如互聯網瀏覽器開發人員工具,Firebug 之類的 JSLink。 如果你在 JavaScript 中放置一個中斷點後它呈現在用戶端,您可以調試就像 C#.NET 代碼 JavaScript。 當您訪問的視圖方法中的上下文時,您可以對通過它你可以看到當前項的每個欄位的值的當前項的引用。 可以使用互聯網資源管理器開發人員工具主控台視窗來訪問當前的物件的任何屬性。

JSLink 提供了自訂任何 SharePoint 視圖中使用一個純淨的用戶端腳本,而無需編寫一行的伺服器端代碼的簡單方法。 您可以使用任何基於 JavaScript 外掛程式與 JSLink。 下載示例演示專案在 msdn.microsoft.com/magazine/msdnmag0614

Pritam Baldota 是一個 SharePoint 顧問在 Microsoft 服務全球交付與超過九年的行業經驗。在他的休閒時間他在博客 pritambaldota.com。聯繫到他在 pritam@pritambaldota.com

感謝以下 Microsoft 技術專家對本文的審閱: 桑傑羅拉、 Subhajit Chatterjee 和帕雷什 Moradiya
桑傑羅拉 — — 桑賈伊是在 Microsoft 服務全球交付專業發展資源管理器。

Subhajit 查特吉是與 Microsoft 服務全球交付具有 12 年以上的行業經驗的高級顧問。 他已執行許多交鑰匙和複雜訂婚在 GD。

帕雷什 Moradiya 在軟體行業擁有 11 + 多年的經驗。 他目前正在自過去 5 年以來作為與微軟公司的顧問。 他是在 SharePoint Web 內容管理和 SharePoint 社會的中小企業。