SharePoint 2013 应用开发实战
上QQ阅读APP看书,第一时间看更新

2.5 SPListItem、SPFile和SPFolder对象

上一节讲解了关于SharePoint列表和列表栏的相关内容。比对SQL数据库,相当于确立了“数据表”的框架,本节将进行“数据表”内容的讲解。在SQL中,一行行的数据构成了一张完整的数据表,在SharePoint里,一个个列表项构成了完整的列表,这一个个列表项就是本节要介绍的对象模型——SPListItem。

2.5.1 SPListItem对象

讲解如何在代码中应用这个对象之前,笔者先在上一节示例的列表中创建两个列表项,用作测试数据。如图2-13所示。

图2-13 带测试数据的示例列表

读者可以直观地看出,列表项就像是一行行的数据,下面的代码演示如何获取这两条数据:

    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
              using (SPWeb web = site.OpenWeb())
              {
                    SPList customList = web.GetList(web.Url + "/Lists/List/");
                    SPListItemCollection listItems = customList.Items;
                    foreach (SPListItem item in listItems)
                    {
                       Console.WriteLine(string.Format("Item Title: {0}; Item
Content: {1}", item["标题"], item["公告内容"]));
                    }
              }
    }

根据最佳实践的原则,不推荐通过SPList对象的Items属性获取列表项的集合到内存中而是使用GetItemById或者加入查询条件等方法,如果一定要获取并遍历全部列表项的集合,建议使用列表项集合对象SPListItemCollection进行缓存,这样可以防止在遍历列表项时每次循环都进行读取操作。

就像SQL数据表的行,在遍历列表项集合时,对每一个列表项,通过列表字段来获取列表项对应字段的值并输出。输出的结果如图2-14所示。

图2-14 获取列表项数据输出结果

接下来演示列表项的常用基本操作。

列表项的新增:

    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
             using (SPWeb web = site.OpenWeb())
             {
                   SPList customList = web.GetList(web.Url + "/Lists/List/");
                   SPListItem addedItem = customList.AddItem();
                   addedItem["标题"] = "公告C";
                   addedItem["公告内容"] = "公告C的内容";
                   addedItem.Update();
              }
    }

新增列表项调用SPList的AddItem方法获得新增列表项的实例,相当于DataTable类的NewRow方法,然后对列表项的栏进行赋值,用[索引|名称]指定具体的栏,最后执行SPListItem的Update方法。添加新列表项的时候一定会发生列表项的更新。

代码执行后的效果如图2-15所示。

图2-15 添加新的列表项

列表项的修改:

    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
             using (SPWeb web = site.OpenWeb())
             {
                    SPList customList = web.GetList(web.Url + "/Lists/List/");
                    SPListItem itemToModify= customList.GetItemById(4);
                    itemToModify ["标题"] = "公告C改";
                    itemToModify ["公告内容"] = "公告C的内容改";
                    itemToModify.Update();
              }
    }

更新列表项,首先获取到要更新的列表项实例,更新方式同上面的新增列表项操作。示例中使用SPListItem.GetItemById方法获得列表项的实例,列表项的ID可以在页面上通过查看列表项的URL获得,右击列表项,选择属性菜单,在弹出的窗口中,找到URL后面的ID属性参数的值,该值即为列表项的ID,如图2-16所示。更新后的效果如图2-17所示。

图2-16 通过查看列表项链接的属性获得列表项的ID

图2-17 执行更新操作后的列表项

列表项的删除:

    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
             {
                 using (SPWeb web = site.OpenWeb())
                 {
                    SPList customList = web.GetList(web.Url + "/Lists/List/");
                    SPListItem itemToDelete = customList.GetItemById(4);
                    itemToDelete.Delete();
                 }
             }

删除列表项在获取到列表项的实例之后执行SPListItem.Delete方法即可。

2.5.2 SPFile和SPFolder对象

SharePoint具有丰富的内容,文件和文件夹存在于网站内容层次和列表内容层次中的各个地方。文件和文件夹对应的对象模型分别为SPFile对象和SPFolder对象,学习该对象模型时读者可以类比文件系统System.IO命名空间下的FileInfo类和DirectoryInfo类。

SPFile对象表示一个SharePoint网站中的文件,这个文件可以在网站中,也可以在文档库或普通列表的某个位置。

获取SPFile对象可以使用SPWeb对象的GetFile方法或GetFileAsString方法,如果想返回集合SPFileCollection对象,可以使用SPWeb或SPFolder的Files属性,该属性表示网站(也可以看作是一个根文件夹)或文件夹的文件集合,使用[索引]获取单个SPFile对象。

SPFolder对象表示SharePoint网站中的文件夹。

在这部分示例中笔者以SharePoint协作网站中默认的文档库为例。该文档库的名称叫做文档,在文档库中创建两个文件夹并上传一些文档到文档库根目录和两个文件夹中。如图2-18所示。

图2-18 文档库示例数据

下面的代码演示如何将该文档库的文件信息采用递归的方式全部读取并打印出来。

    static void Main(string[] args)
    {
          using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
          {
                using (SPWeb web = site.OpenWeb())
                {
                   SPFolder docLibFolder = web.Folders'"Shared Documents"';
                   if (docLibFolder.Exists)
                   {
                      ReadDocInfo(docLibFolder);
                   }
                }
             }
          }
          static void ReadDocInfo(SPFolder folder)
          {
             SPFileCollection docFiles = folder.Files;
             foreach (SPFile docFile in docFiles)
             {
                 Console.WriteLine(string.Format("File Name: {0}, in folder {1},
size: {2} bytes", docFile.Name, folder.Name, docFile.Length));
             }
             SPFolderCollection subFolders = folder.SubFolders;
             foreach (SPFolder subFolder in subFolders)
             {
                ReadDocInfo(subFolder);
             }
    }

首先获取到要读取文件内容的根目录,即上面所述的文档库,然后递归遍历该目录下的所有文件,运行结果如图2-19所示,用这种方式遍历还读取出了列表中的系统文件,如DispForm.aspx、EditForm.aspx等。

图2-19 获取文档库中的文件信息

再演示一个将某个文件拷贝到另一个位置的例子:

    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
              using (SPWeb web = site.OpenWeb())
              {
                    SPFile file = web.GetFile("/Shared Documents/文档二.docx");
                    if (file.Exists)
                    {
                       SPFolder destFolder = web.GetFolder("/Shared Documents/文件
夹一");
                       if (destFolder.Exists)
                       {
                          byte[] content = file.OpenBinary();
                          destFolder.Files.Add("拷贝文档二.docx", content, true);
                       }
                   }
              }
    }

在文档库这样特殊的列表中,一个文档同时也是一个列表项。因此在对象模型中,使用SPListItem对象或是SPFile对象都可以表示一个文档,并且二者可以通过SPListItem.File和SPFile.Item互相转换。

以上两节所述常用对象模型是开发人员在开发过程中经常会使用到的,图2-20展示了这些对象模型之间的层次结构关系,方便读者加深认识和理解。

图2-20 SPList、SPField、SPView、SPListItem、SPFile和SPFolder的层级关系