在一个传统的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();

SharePoint服务器端对象模型 之 对象模型概述(Part 1)的更多相关文章

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

    (三)Url 作为一个B/S体系,在SharePoint的属性.方法参数和返回值中,大量的涉及到了Url,总的来说,涉及到的Url可以分为如下四类: 绝对路径:完整的Url,包含了协议头(http或h ...

  2. SharePoint服务器端对象模型 之 使用CAML进展数据查询

    SharePoint服务器端对象模型 之 使用CAML进行数据查询 一.概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列 ...

  3. SharePoint服务器端对象模型 之 序言

    对于刚刚开始接触SharePoint的开发人员,即使之前有较为丰富的ASP.NET开发经验,在面对SharePoint时候可能也很难找到入手的方向.对于任何一种开发平台而言,学习开发的过程大致会包括: ...

  4. SharePoint服务器端对象模型 之 访问网站和列表数据(Part 1)

    本节将会介绍SharePoint中最为常用的一些对象模型,以及如何使用这些对象模型来访问和操作网站中的数据.几乎所有的SharePoint服务器端开发都会涉及到这些内容,因此应着重掌握本节中所介绍的基 ...

  5. 开启貌似已经过时很久的新坑:SharePoint服务器端对象模型

    5年前(嗯,是5年前),SharePoint 2010刚发布的时候,曾经和kaneboy试图一起写一本关于SharePoint 2010开发的书,名字叫<SharePoint 2010 应用开发 ...

  6. SharePoint服务器端对象模型 完结

    整个系列已完结,大概看了一眼,平均阅读量不到200.估计也没什么人看了,而且服务器端对象模型除了在某些企业开发中会用到,从2013时代开始其实已经不是SharePoint开发的最佳选择了.不过既然已经 ...

  7. SharePoint服务器端对象模型 之 访问用户、用户组和权限(Part 1)

    (一)概述 SharePoint权限系统是整个SharePoint体系中一个比较重要的部分,权限系统主要分成两大部分:认证和授权. 认证主要解决的问题是判断登陆者是否合法,以及他究竟是哪一个用户,Sh ...

  8. SharePoint服务器端对象模型 之 使用CAML进行数据查询

    (一)概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列表条目的集合. 除去列表上的查询之外,在SharePoint中还大 ...

  9. SharePoint 服务器端对象模型 之 使用LINQ进行数据访问操作(Part 2)

    (四)使用LINQ进行列表查询 在生成实体类之后,就可以利用LINQ的强大查询能力进行SharePoint列表数据的查询了.在传统SharePoint对象模型编程中,需要首先获取网站对象,再进行其他操 ...

随机推荐

  1. [转]SQL Server 性能调优(io)

      目录 诊断磁盘io问题 常见的磁盘问题 容量替代了性能 负载隔离配置有问题 分区对齐配置有问题 总结 关于io这一块,前面的东西如磁盘大小,磁盘带宽,随机读取写入,顺序读取写入,raid选择,DA ...

  2. 【转】线程同步------java synchronized详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...

  3. 非等高cell实战--实现微博页面

    代码地址如下:http://www.demodashi.com/demo/11639.html 前言 学习过UITableView.AutoLayout以及MVC的相关知识,接下来通过一个微博页面实战 ...

  4. 网站定时任务IIS配置

    网站中的定时任务一般是必不可少的,具体的实现方法此文不做详细说明,如有需要了解的请留言.本文主要讲述定时任务有关IIS中的设置. 如果一个网站在20分钟内(IIS默认为20分钟)没有客户端访问,服务器 ...

  5. NodeJS 安装不存在的模块

    设置npm镜像: npm config set registry https://registry.npm.taobao.org 我遇到的报错情况: Error: Cannot find module ...

  6. html标签说明

    dictype 不区分大小写 HTML 4.01 与 HTML5 之间的差异 在 HTML 4.01 中有三种 <!DOCTYPE> 声明.在 HTML5 中只有一种: <!DOCT ...

  7. nginx跨域(转2)

    当出现403跨域错误的时候 No 'Access-Control-Allow-Origin' header is present on the requested resource,需要给Nginx服 ...

  8. elasticsearch 索引设置

    索引设置 你可以通过很多种方式来自定义索引行为,你可以阅读Index Modules reference documentation,但是: 提示: Elasticsearch 提供了优化好的默认配置 ...

  9. Android JNI和NDK学习(02)--静态方式实现JNI(转)

    本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3095013.html JNI包括两种实现方法:静态和动态.两种方法的区别如下 ...

  10. Django学习之模板标签和变量

    safe过滤器和{% autoescape %}标签 首先看这样一个例子: views.py中: c = '<h3>更上一层楼</h3>' render(request,'te ...