在Project Web Access中的項目中心,每個項目對應一個項目工作區,即SPWeb。項目網站內提供了項目工作環境中所需的列表,以便與 Microsoft Office Project Server 2007 集成,其中包括項目文檔、項目問題、項目風險和項目可交付結果。項目中的任務可以設置鏈接這些列表中的文檔或者條目。如果關聯了某一個文檔,項目和任務都會有圖標標識有鏈接文檔。
但是第一、project server 只支持鏈接本工作區的項目文檔庫內的文檔。第二、貌似它本身有個bug:如果刪除文檔的話,此任務再需要鏈接文檔時,將會報錯顯示,不存在列表項。但是很多企業的文檔存放都是需要統一的管理,要放在一個網站內方便管理。某些文檔可能是N個任務都需要鏈接的,如果項目很多,分的任務也很多,勢必造成文檔的更新以及佔用不必要的資源等問題。
Project server 提供了可以定製開發的web service,可以從官方下載sdk
從sdk中查到它提供了[ObjectLinkProvider Web service]命名空間,可以再進一步看到所有這些鏈接都是用繼承自System.Data.DataSet的ObjectLinkProviderDataSet存儲的項目以及任務、文檔庫、文檔的ID實現的。並且提供了多種獲取objectLinkProviderDataSet的方法。
- string psiBaseUrl = "網站路徑+/_vti_bin/psi/";
- SvcObjectLinkProvider.ObjectLinkProvider objectLinkProvider = new ObjectLinkProvider();
- objectLinkProvider.Url = psiBaseUrl + "objectlinkprovider.asmx";
- objectLinkProvider.Credentials = CredentialCache.DefaultCredentials;
- ObjectLinkProviderDataSet readdsLinkedObjects = objectLinkProvider.ReadTaskLinkedWebObjects(taskUid,
- (int)WebObjectType.Document);
- foreach (ObjectLinkProviderDataSet.WebObjectsRow objRow in readdsLinkedObjects.WebObjects)
- {
- if (objRow.WOBJ_TASK_UID != taskUid && objRow.WOBJ_LIST_NAME == listUid)
- {
- Response.Write(objRow.WOBJ_TP_ID.ToString());
- }
- }
這樣看來,我們似乎可以嘗試強制把本網站外的文檔庫和文檔的ID和當前任務的ID存儲在一個ObjectLinkProviderDataSet中。
Sdk中提供了一些samples,仿照它們我嘗試在\LAYOUTS\PWS中添加自定義的頁面替代原先的LinkItemsPage.aspx去實現新建、查看和刪除鏈接。然後在文檔的查看錶單頁面添加webpart實現可查看鏈接此文檔的所有任務,以及在文檔庫附加刪除時的事件處理程序,同時刪除鏈接的objectLinkProviderDataSet。
最終倒是實現了客戶的需求,但是也有一些問題:
1、 原先的LinkItemsPage.aspx頁面將不可用,會報錯顯示找不到文檔庫。
2、 如果鏈接風險或者問題,也同樣需要開發,我嘗試將點擊鏈接風險或者問題時的URL參數中的參數“WSSListType”替換了也同樣加載不了。我的項目中是客戶不需要這功能,就乾脆把“鏈接風險”和“鏈接問題”用JS隱藏了。
3、 文檔的反向鏈接項目中的任務也需要單獨開發。