前面的文章介绍了“
创建Feature扩展SharePoint列表项或文档的操作菜单项”。我们可以通过这种方式将用户导航到自定义应用程序页面中。还是以项目级审核为例,我们可以在某个文档库中的每个文档上增加一个菜单项,将用户导航到一个自定义应用页面来显示该文档的审核历史纪录。
当用户点击列表项上的菜单条目时,通常会运行一个应用程序页面。该页面背后的代码往往是针对前面点击的那个列表项或文档来编程。为了实现这种效果,应用程序页面必须能取到该列表项或文档才行。SharePoint通过将列表项或文档的标识信息添加到应用程序页面的query string中来传递这些信息。这样页面就可以在其初始化时通过代码获取该信息并创建出SPListItem对象和其所属的SPList对象。
我们编写CustomAction实体创建一个列表条目上的菜单项,并将用户导航到自定义页面。这个过程中,我们可以使用动态标记(tokens)来配置Url属性,SharePoint会在运行时替换这些标记。一般我们将UrlAction元素的Url属性设置为类似下面的样子:
~site/_layouts/ItemAudit.aspx?ItemId={ItemId}&ListId={ListId}
这个Url将用户导航到一个名为ItemAudit.aspx的自定义页面。我们注意到该URL包含三个标记。 ~site部分会被当前网站的Url替代。{ListId}部分会被当前列表或文档库的GUID替代。{ItemId}部分会被当前列表项或文档的ID号替代。后两者常用于创建query string,来传递信息给应用页面,使其可以定位列表或文档库对象中条目。
现在,我们来通过代码获取query string传递过来的列表项ID和其所属列表的GUID。使用标准的ASP.NET Request对象的QueryString属性来接收。
SPSite siteCollection = this.Site;
SPWeb site = this.Web;
// obtain query string values
string ListId = Request.QueryString["ListId"];
string ItemId = Request.QueryString["ItemId"];
// create list object and list item object
SPList list = site.Lists[new Guid(ListId)];
SPListItem item = list.Items.GetItemById(Convert.ToInt32(ItemId));
// query for information about list and list item
string ListTitle = list.Title;
string ItemTitle = item.Title;
这里一个重要的地方是,究竟是使用SPDocumentLibrary对象还是SPList对象来进行code?文档库是一个特殊的列表,我们可以将SPList对象转换成SPDocumentLibrary对象。通过转换我们可以使用更多的只有对文档库有效的属性和方法。您也可以使用SPListItem的File属性来返回一个SPFile对象。这样,我们就可以编程访问该文档本身。
if (list is SPDocumentLibrary) {
SPDocumentLibrary documentLibrary = (SPDocumentLibrary)list;
string DocumentTemplateUrl = documentLibrary.DocumentTemplateUrl;
SPFile file = item.File;
string FileAuthor = file.Author.Name;
string FileSize = file.TotalLength.ToString("0,###") + " bits";
}