- SharePoint 教程
- SharePoint - 首页
- SharePoint - 概述
- SharePoint - 类型
- SharePoint - 功能
- SharePoint - 设置环境
- SharePoint - 创建网站集
- SharePoint - API
- SharePoint - 中心管理
- SharePoint - 应用模型
- SharePoint - 集成选项
- SharePoint - 开发工具
- SharePoint - 列表功能
- 其他列表功能
- SharePoint - 自定义列表
- SharePoint - 库
- SharePoint - Web 部件
- 网站列和内容类型
- SharePoint - 数据
- SharePoint - 服务器对象模型
- SharePoint - 客户端对象模型
- SharePoint - REST API
- SharePoint - 功能和元素
- SharePoint - 功能/事件接收器
- SharePoint - Azure 平台
- SharePoint - 打包和部署
- SharePoint - 沙盒解决方案
- SharePoint - 应用
- SharePoint 有用资源
- SharePoint - 快速指南
- SharePoint - 资源
- SharePoint - 讨论
SharePoint - 服务器对象模型
在本节中,我们将了解 SharePoint 服务器对象模型。当您编写将在 SharePoint 上下文中运行的代码时,可以使用 SharePoint 服务器对象模型。一些常见的示例包括页面或 Web 部件中的代码隐藏、功能或列表后面的事件处理程序、计时器作业等。
服务器对象模型的功能
以下是服务器对象模型的关键功能
如果您正在同一个应用程序池中编程 ASP.NET 应用程序(SharePoint 使用该应用程序池),则可以使用服务器对象模型。
如果您正在开发客户端应用程序(例如控制台或 Windows 窗体或 WPF 应用程序,这些应用程序将在 SharePoint 服务器上运行),则可以使用服务器对象模型。
您无法使用服务器对象模型远程连接到 SharePoint 服务器。
当您想要使用服务器对象模型时,请引用 **Microsoft.SharePoint** 程序集。还有其他程序集构成了服务器对象模型,但 Microsoft.SharePoint 是主要的程序集。
您最常使用的核心类型映射到您作为最终用户使用的组件,因此诸如网站集、网站、列表、库和列表项之类的内容由 SPSite、SPWeb、SPList、SPDocumentLibrary 和 SPListItem 类型表示。
表示网站集的类型和服务器对象模型是 SPSite,表示 SharePoint 网站的服务器对象模型类型是 SPWeb。因此,当您从最终用户术语转换为开发人员术语时,只需进行这种心理映射即可。
现在,当您第一次开始使用 SharePoint 时,可能会感到困惑,因为“网站”一词含义非常广泛,在最终用户和开发人员的词汇表中具有相反的含义,更不用说 Web 词汇表了。
让我们来看一个服务器对象模型的简单示例。
**步骤 1** - 打开 Visual Studio 并从 **文件 → 新建 → 项目** 菜单选项创建一个新项目。
**步骤 2** - 在左侧窗格中从 **模板 → Visual C#** 选择 Windows,然后在中间窗格中选择控制台应用程序。输入项目的名称,然后单击“确定”。
**步骤 3** - 创建项目后,右键单击解决方案资源管理器中的项目,然后选择 **添加 → 引用**。
**步骤 4** - 在左侧窗格中选择 **程序集 → 扩展**,然后在中间窗格中选中 Microsoft.SharePoint,然后单击“确定”按钮。
现在再次右键单击解决方案资源管理器中的项目,然后选择“属性”。
**步骤 5** - 单击左侧窗格中的 **生成** 选项卡,然后取消选中 **首选 32 位** 选项。
**步骤 6** - 现在返回到 **Program.cs** 文件,并将其替换为以下代码。
using Microsoft.SharePoint; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SharePointData { class Program { static void Main(string[] args) { using (var site = new SPSite("http://waqasserver/sites/demo")) { var web = site.RootWeb; Console.WriteLine(web.Title); var lists = web.Lists; foreach (SPList list in lists) { Console.WriteLine("\t" + list.Title); } Console.ReadLine(); } } } }
**注意** - 在上面的代码中,首先创建了一个新的 SPSite 对象。这是一个可处置对象,因此它是在 using 语句中创建的。SPSite 构造函数接受网站集的 URL,在您的情况下,该 URL 将有所不同。
var **web = site.RootWeb** 将获取网站集的根目录。
我们可以使用 web.Lists 获取列表并打印列表项的标题。
编译并执行上述代码后,您将看到以下输出:
SharePoint Tutorials appdata Authors Composed Looks Contacts Course Documents Courses Documents List Template Gallery Master Page Gallery Site Assets Site Pages Solution Gallery Style Library Theme Gallery User Information List Web Part Gallery
您可以看到这些标题是解决方案库、样式库、表单模板。这些是 SharePoint 内部使用的列表。因此,与其显示所有列表,不如只显示用户通常会看到的列表。
因此,与其获取整个列表集合,不如获取所有未隐藏的列表。我们可以使用如下所示的链接查询来实现。
using Microsoft.SharePoint; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ServerObjectModel { class Program { static void Main(string[] args) { using (var site = new SPSite("http://waqasserver/sites/demo")) { var web = site.RootWeb; Console.WriteLine(web.Title); var lists = from SPList list in web.Lists where list.Hidden == false select list; foreach (SPList list in lists) { Console.WriteLine("\t" + list.Title); } Console.ReadLine(); } } } }
编译并执行上述代码后,您将看到以下输出:
SharePoint Tutorials Authors Contacts Course Documents Courses Documents Site Assets Site Pages Style Library
您可以看到,这将返回所有未隐藏的列表。
让我们来看另一个简单的示例,我们还将在其中显示有关列表项的一些信息。
using Microsoft.SharePoint; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ServerObjectModel { class Program { static void Main(string[] args) { using (var site = new SPSite("http://waqasserver/sites/demo")) { var web = site.RootWeb; Console.WriteLine(web.Title); var lists = from SPList list in web.Lists where list.Hidden == false select list; foreach (SPList list in lists) { Console.WriteLine("\t" + list.Title); var items = list.Items.OfType<SPListItem>().Take(5); var isDocLib = list is SPDocumentLibrary; foreach (SPListItem item in items) { var value = isDocLib ? item.Name : item.Title; Console.WriteLine("\t\t" + value); } } Console.ReadLine(); } } } }
编译并执行上述代码后,您将看到以下输出:
SharePoint Tutorials Authors Muhammad Waqas Mark Upston Allan Bommer Andy Onian Contacts Waqas Upston Bommer Course Documents Sample1.docx Sample2.docx Sample3.docx Courses SharePoint Tutorials C# Tutorials ASP.Net Tutorials NHibernate Tutorials Documents Site Assets Site Pages Home.aspx How To Use This Library.aspx Style Library
列表数据
当您第一次创建列表时,它始终具有一个标题列。默认情况下,此标题列允许访问列表项上下文或编辑控件块菜单。
由于每个列表都以一个列(标题)开头,因此 **SPListItem** 类型将其公开为属性。对于并非每个列表都通用的列,您可以通过 **SpListItem** 类型的索引器访问它们。
您可以向索引器传递几条信息,但最常见的是 **列**。列表设置中的最终用户可以更改此名称。您不希望使用此名称,因为该名称可能会发生更改。
第二个是 **内部名称**,它是在创建此列表时设置的,并且永远不会更改。当您访问列值时,这是您要使用的名称。
让我们来看一个简单的示例,我们将在其中检索“作者”列表,如下所示:
在此示例中,我们将获取“作者”列表,然后将“工资/费率”提高某个值。因此,对于“工资/费率”列,我们将使用 **内部名称**。
**步骤 1** - 转到服务器资源管理器;右键单击 **SharePoint 连接**,然后选择“添加连接...” 指定 URL,然后单击“确定”。
**步骤 2** - 展开 **SharePoint 教程 → 列表库 → 列表 → 作者 → 字段 → 工资/费率** 字段。右键单击 **工资/费率**,然后选择“属性”。您将在“属性”窗口中看到 **内部名称**。
**步骤 3** - 下面是一个根据“工资/费率”检索“作者”并提高其“工资/费率”的简单示例。
using Microsoft.SharePoint; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ServerObjectModel { class Program { static void Main(string[] args) { using (var site = new SPSite("http://waqasserver/sites/demo")) { var web = site.RootWeb; var list = web.Lists.TryGetList("Authors"); if (list == null) return; var items = list.Items; ShowItems(items); RaiseRates(items); Console.WriteLine("\nAfter Raise\n"); ShowItems(items); Console.ReadKey(); } } static void RaiseRates(SPListItemCollection items) { foreach (SPListItem item in items) { var employee = Convert.ToBoolean(item["Employee"]); var rate = Convert.ToDouble(item["Salary_x002f_Rate"]); var newRate = employee ? rate + 1 : rate + 0.1; item["Salary_x002f_Rate"] = newRate; item.Update(); } } static void ShowItems(SPListItemCollection items) { foreach (SPListItem item in items) { Console.WriteLine("Salary or rate for {0} is {1:c}", item.Title, item["Salary_x002f_Rate"]); } } } }
在上面的代码中,您可以看到我们有两个方法:
一个是检索列表,称为 **ShowItems**,并且
另一个方法是提高费率,称为 **RaiseRates()**。
编译并执行上述代码后,您将看到以下输出:
Salary or rate for Muhammad Waqas is $950.00 Salary or rate for Mark Upston is $15.00 Salary or rate for Allan Bommer is $20.00 Salary or rate for Andy Onian is $870.00 After Raise Salary or rate for Muhammad Waqas is $951.00 Salary or rate for Mark Upston is $15.10 Salary or rate for Allan Bommer is $20.10 Salary or rate for Andy Onian is $871.00
CAML 查询
在上面的示例中,我们始终使用 foreach 循环遍历项目,并且多次遍历所有项目,并且我们始终都取回所有列,或者至少所有列都是可访问的。
这实际上类似于在 SQL 查询中执行 select* from 表名。
我们可以通过使用所谓的 **CAML 查询** 来解决此问题。执行 CAML 查询时,您有两个选项:
如果只想查询单个列表,可以使用 SPQuery 对象。
如果要查询网站集中的多个列表,则可以使用 SPSiteDataQuery。
通常,当您执行 **SPSiteDataQuery** 时,您正在查询特定类型的全部列表。
例如,我想查询所有联系人列表等。SPSiteDataQuery 允许您确定范围,因此您可以指示要查询整个网站集、单个网站或网站及其所有子网站。
CAML 查询的语法基本上是用 XML 格式描述的,需要一些时间才能习惯于构建此类查询。
让我们来看一个 CAML 查询的简单示例。在这里,我们将创建一个 CAML 查询来查询“作者”列表中的数据。
using Microsoft.SharePoint; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ServerObjectModel { class Program { static void Main(string[] args) { using (var site = new SPSite("http://waqasserver/sites/demo")) { var web = site.RootWeb; var list = web.Lists.TryGetList("Authors"); if (list == null) return; var items = QueryItems(list); ShowItems(items); //RaiseRates(items); //Console.WriteLine("\nAfter Raise\n"); //ShowItems(items); Console.ReadKey(); } } static SPListItemCollection QueryItems(SPList list) { var query = new SPQuery(); query.ViewFields = "<FieldRef Name='Title' />" + "<FieldRef Name='Employee' />" + "<FieldRef Name='Salary_x002f_Rate' />"; query.Query = "<OrderBy>" + " <FieldRef Name='Salary_x002f_Rate' />" + "</OrderBy>" + "<Where>" + " <Eq>" + " <FieldRef Name='Employee' />" + " <Value Type='Boolean'>False</Value>" + " </Eq>" + "</Where>"; return list.GetItems(query); } static void RaiseRates(SPListItemCollection items) { foreach (SPListItem item in items) { var employee = Convert.ToBoolean(item["Employee"]); var rate = Convert.ToDouble(item["Salary_x002f_Rate"]); var newRate = employee ? rate + 1 : rate + 0.1; item["Salary_x002f_Rate"] = newRate; item.Update(); } } static void ShowItems(SPListItemCollection items) { foreach (SPListItem item in items) { Console.WriteLine("Salary or rate for {0} is {1:c}", item.Title, item["Salary_x002f_Rate"]); } } } }
我们使用了 CAML 查询来获取一些项目。在 **QueryItems** 方法中,您可以看到我们只检索了那些不是“员工”的项目。
Salary or rate for Mark Upston is $15.10 Salary or rate for Allan Bommer is $20.10