SharePoint - 服务器对象模型

在本章中,我们将介绍SharePoint Server对象模型.在编写将在SharePoint上下文中运行的代码时,可以使用SharePoint Server对象模型.一些常见的例子是页面或Web部件中的代码隐藏,功能或列表后面的事件处理程序,计时器作业等.

服务器对象模型的功能

以下是服务器对象模型的主要功能

  • 您可以使用服务器对象模型您正在SharePoint使用的同一应用程序池中编写ASP.NET应用程序.

  • 如果您正在开发客户端应用程序,则可以使用服务器对象模型例如控制台或Windows窗体或将在SharePoint服务器上运行的WPF应用程序.

  • 您无法使用服务器对象模型远程连接到SharePoint Server .

  • 如果要使用服务器对象模型,请参阅 Microsoft.SharePoint 程序集.还有其他程序集构成服务器对象模型,但Microsoft.SharePoint是主要的程序.

  • 您最常使用的核心类型映射对于您用作最终用户的组件,因此网站集,网站,列表,库和列表项等内容由SPSite,SPWeb,SPList,SPDocumentLibrary和SPListItem类型表示.

  • 表示网站集的类型和服务器对象模型是SPSite,服务器对象模型中表示SharePoint网站的类型是SPWeb.因此,当您从最终用户条款转到开发人员条款时,您只需要进行心理映射.

现在你首先开始使用SharePoint,它可能会让人感到困惑,因为网站过载太多了,这意味着最终用户和开发人员词汇表相反,更不用说网络词汇了.

让我们来看看看一下服务器对象模型的一个简单例子.

第1步 : 打开Visual Studio并从 File → 创建一个新项目;新的 → 项目菜单选项.

第2步 : 从 Templates → 中选择Windows.在左窗格中单击Visual C#,然后在中间窗格中选择"控制台应用程序".输入项目名称,然后单击"确定".

步骤3 : 创建项目后,在解决方案资源管理器中右键单击该项目,然后选择添加 → 参考文献.

控制台应用程序

步骤4 : 选择 Assemblies → 左窗格中的"扩展"并在中间窗格中选中Microsoft.SharePoint,然后单击"确定"按钮.

现在,在"解决方案资源管理器"中再次右键单击该项目,然后选择"属性".

Assemblies

第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,在您的情况下将是不同的.

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 type将其公开为属性.对于每个列表不常见的列,您可以通过 SpListItem 类型的索引器访问它们.

您可以传递几条信息到索引器,但最常见的是.列表设置中的最终用户可以更改此名称.您不想使用此名称,因为它可以更改.

第二个是 InternalName ,它是在创建此列表时设置的,它永远不会改变.这是您在访问列值时要使用的名称.

让我们看一下我们将检索作者列表的简单示例,如下所示 :

简单示例

在本例中,我们将获取作者列表然后将薪资/税率提高一些值.因此,对于Salary/Rate列,我们将使用 InternalName .

步骤1 : 转到服务器资源管理器;右键单击 SharePoint Connections 并选择添加连接...指定URL并单击确定.

SharePoint Connections

第2步 : 展开 SharePoint教程 →  List Libraries → 列表 → 作者 → 菲尔兹 → 薪水/费率字段.右键单击薪资/费率,然后选择"属性".您将在"属性"窗口中看到 InternalName .

SharePoint Tutorials

第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 table name.

我们可以使用所谓的 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 方法中,您可以看到我们只检索了那些非Employee的项目.

Salary or rate for Mark Upston is $15.10
Salary or rate for Allan Bommer is $20.10