在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的方法。

  1. string psiBaseUrl = "网站路径+/_vti_bin/psi/";  
  2. SvcObjectLinkProvider.ObjectLinkProvider objectLinkProvider = new ObjectLinkProvider();  
  3. objectLinkProvider.Url = psiBaseUrl + "objectlinkprovider.asmx";  
  4. objectLinkProvider.Credentials = CredentialCache.DefaultCredentials;  
  5.  
  6. ObjectLinkProviderDataSet readdsLinkedObjects = objectLinkProvider.ReadTaskLinkedWebObjects(taskUid,  
  7.     (int)WebObjectType.Document);  
  8.  
  9. foreach (ObjectLinkProviderDataSet.WebObjectsRow objRow in readdsLinkedObjects.WebObjects)  
  10. {  
  11.      if (objRow.WOBJ_TASK_UID != taskUid && objRow.WOBJ_LIST_NAME == listUid)  
  12.      {  
  13.            Response.Write(objRow.WOBJ_TP_ID.ToString());  
  14.      }  
这样看来,我们似乎可以尝试强制把本网站外的文档库和文档的ID和当前任务的ID存储在一个ObjectLinkProviderDataSet中。
Sdk中提供了一些samples,仿照它们我尝试在\LAYOUTS\PWS中添加自定义的页面替代原先的LinkItemsPage.aspx去实现新建、查看和删除链接。然后在文档的查看表单页面添加webpart实现可查看链接此文档的所有任务,以及在文档库附加删除时的事件处理程序,同时删除链接的objectLinkProviderDataSet。
最终倒是实现了客户的需求,但是也有一些问题:
1、 原先的LinkItemsPage.aspx页面将不可用,会报错显示找不到文档库。
2、 如果链接风险或者问题,也同样需要开发,我尝试将点击链接风险或者问题时的URL参数中的参数“WSSListType”替换了也同样加载不了。我的项目中是客户不需要这功能,就干脆把“链接风险”和“链接问题”用JS隐藏了。
3、 文档的反向链接项目中的任务也需要单独开发。