SharePoint服务器端对象模型 之 对象模型概述(Part 1)

在一个传统的ASP.NET开发过程中,我们往往会把开发分为界面展现层、逻辑业务层和数据访问层这三个层面。作为一个应用开发平台,SharePoint是微软在直观的开发能力和自由的扩展能力之间,取到的一个平衡点,其对象模型的设计理念也反映了这两者之间的平衡。做一个并不太准确地比喻,在SharePoint中对象模型的地位就相当于传统的数据访问层,只不过我们所面对的既不是具体的和实际业务需求相关的对象实体(直观开发),也不是底层的数据库表(自由扩展),而是在SharePoint平台中诸如网站、列表、文件、用户这样的“对象”。这是SharePoint开发与传统的ASP.NET开发区别最大的一点,带着这样的思路去理解SharePoint开发,必然会事半功倍。

 

(一)SharePoint对象模型的命名特点

SharePoint常用对象模型基本上可以从名字直接看出其对应的内容,对象命名一般以“SP”开头(SharePoint的缩写),后面为所描述的内容。例如SPWeb(网站)、SPList(列表)、SPField(列表栏)、SPListItem(列表条目,注意SharePoint中也有SPItem,但是并非完全是用于描述列表条目的)、SPFile(文件)、SPFolder(文件夹)等等。

从对象属性中,也大都可以了解其所对应的内容以及相应的对象,如SPList.ParentWeb(列表所在网站,SPWeb类型)等。

在方法的参数表中,其名称也大都可以看出所表示的内容和对应类型,不过也有例外(比如一些叫做strSiteName的参数以及SPWeb的Name属性,指的并非是网站名称,而是网站的Url)。

 

(二)集合和其相关操作

在SharePoint的对象模型中,集合是一个非常重要的概念,很多类都拥有与之对应的集合类,其命名都是在类的名称后面加上“Collection”,例如SPWebCollection、SPListCollection、SPFieldCollection、SPListItemCollection等等。(但也有例外,比如SPAttachmentCollection类描述列表附件的集合,但是并没有SPAttachment类,后文会有关于此类的介绍)

在类的属性中,集合也有比较明显的体现,一般都是以相应对象的复数形式出现,例如spWeb.Lists(对应SPListCollection)、spList.Fields(对应SPFieldCollection)等等。(不过也有例外,例如spList.Folders,对应的是SPListItemCollection,而不是SPFolderCollection,其原因在后文会有详细解释)

 

1、集合中的操作

在集合中涉及到对其中对象的增、删、查、改四种操作,都有一些规律性的方法存在。在大部分常用对象模型中,基本上都包含这些操作方式,因此本章后面在介绍具体对象使用的时候,除特别声明的方法之外,将不再介绍相应对象的添加、删除和修改操作,请读者自行按照这些方法名称阅读SDK中的相关内容。

添加(Add:向集合中添加对象的时候,一般都是使用xxxCollection.Add方法,针对不同的对象可能有不同的参数表,同一种集合对象也可能有不同的重载,具体可以参考各集合类的SDK。一般而言,在执行完Add方法之后,对象即被添加到了SharePoint中(一个例外是SPListItemCollection的Add方法,即添加列表条目的方法,在后文中会详细介绍)。

删除(Delete:从集合中删除某个特定对象一般是调用集合对象的Delete方法(有些对象使用的是Remove),参数一般是对象的ID等。不过更常用的方法是直接调用该对象本身的Delete方法,可以直接删除掉对象。需要注意的是,通过对象模型的Delete方法删除的内容会确实的从SharePoint中删除掉,而不经过回收站。如果需要将内容删除到回收站中,可以使用对象的Recycle方法,一般可以被删到回收站中的对象都提供了此方法,包括SPList、SPListItem、SPFile和SPFolder。

查找(Get:这里的查找指的是从集合中找到某一个对象的方法(根据指定条件进行查询的方法会在后文进行介绍)。一般而言,集合都提供了若干种索引器进行查找,形式类似于xxxCollection[xxx],集合的索引器可以通过多种方式从集合中找到相应的对象,例如下标(和数组类似,比如listItems[0])、对象的标题(比如lists[“Customers”])、对象的GUID等。除此之外,很多集合还提供了形如GetxxxByxxx的方法,即根据xxx获取xxx,例如spListItemCollection.GetItemByID、spUserCollection.GetByEmail等等。

修改(Update):在SharePoint中,对某个对象的属性进行修改之后可能不会立即生效,需要调用对象的Update方法令修改生效。但是也有一些个别的属性是临时性的,不需要调用Update方法,比如spWeb.AllowUnsafeUpdate等,需要针对具体情况具体分析。

 

2、集合的访问

SharePoint的一些常见对象大体上可以形成一种包含关系,例如网站包含了列表、列表包含了列表条目等。在对象模型中,这种包含关系体现为集合的向下和向上访问的属性。

向下访问的属性描述了获取对象中所包含内容的集合,例如spSite.AllWebs(网站集中的网站)、spWeb.Lists(网站中的列表)、spList.Views(列表中的视图)等。

向上访问的属性描述了其对象所在的父对象,例如spView.ParentList(视图所对应的列表)、spList.ParentWeb(列表所在网站)、spWeb.Site(网站所在的网站集)等。

不过需要说明的是,在一些比较特殊的情况下,可能无法直接从子对象的属性获取到父对象(相应的属性为null),这个时候需要使用其他的手段获取到父对象,但并不意味着该对象没有父对象。

 

3、从集合获取数据的一个特性

在SharePoint的集合对象中有一个特点,就是当返回一个集合的时候,出于性能考虑并非会立刻返回集合中的所有对象;而在调用集合索引器的时候,才会真正创建相应的对象并返回,因此如下的程序写法是有问题的(虽然我们尚未介绍到具体对象模型的使用,但是通过望文生义,也能理解这段程序的功能):

   1: // A wrong example:
   2: site.AllWebs[0].Title = "New Site Title";
   3: site.AllWebs[0].Update();

上面这段程序的写法相当于:

   1: SPWeb web1 = site.AllWebs[0];
   2: web1.Title = "New Site Title";
   3: SPWeb web2 = site.AllWebs[0];
   4: web2.Update();

这样的程序当然是无法得到我们期望的结果的,SharePoint包括网站、列表、列表条目等在内的集合都有这样的特性,类似的代码错误曾经出现在某些实际项目的代码中,开发人员花了很长时间才了解到这一特性,希望各位读者能够引以为鉴。上述代码的正确写法应为:

   1: // Correct Code:
   2: SPWeb niceWeb = site.AllWebs[0];
   3: niceWeb.Title = "New Site Title";
   4: niceWeb.Update();

posted on 2014-10-27 17:57  Erucy  阅读(931)  评论(0编辑  收藏  举报

导航