📜  SharePoint-服务器对象模型

📅  最后修改于: 2020-11-19 08:14:51             🧑  作者: Mango


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

服务器对象模型的功能

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

  • 如果要在SharePoint使用的同一应用程序池中对ASP.NET应用程序进行编程,则可以使用服务器对象模型。

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

  • 您不能使用服务器对象模型远程连接到SharePoint Server。

  • 当您要使用服务器对象模型时,请参考Microsoft.SharePoint程序集。还有其他程序集组成服务器对象模型,但是Microsoft.SharePoint是主要的程序集。

  • 您将最常使用的核心类型映射到用作最终用户的组件,因此,诸如网站集,网站,列表,库和列表项之类的内容由类型SPSite,SPWeb,SPList,SPDocumentLibrary和SPListItem。

  • 表示网站集的类型和服务器对象模型为SPSite,在服务器对象模型中表示SharePoint网站的类型为SPWeb。因此,当您从最终用户术语转到开发人员术语时,只需进行思维导图。

现在,当您首次开始使用SharePoint时,它可能会造成混乱,因为网站是如此超负荷,并且在最终用户和开发人员词汇中意味着相反的事情,更不用说网络词汇了。

让我们看一个服务器对象模型的简单示例。

步骤1-打开Visual Studio,然后从文件→新建→项目菜单选项中创建一个新项目。

步骤2-在左窗格中的模板→Visual C#中选择Windows,然后在中间窗格中选择控制台应用程序。输入您的项目名称,然后单击“确定”。

步骤3-创建项目后,在解决方案资源管理器中右键单击该项目,然后选择添加→引用

控制台应用

步骤4-在左侧窗格中选择Assemblies→Extensions ,然后在中间窗格中选中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,具体情况视情况而定。

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().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类型的索引器访问它们。

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

第二个是InternalName ,它在创建此列表时设置,并且永不更改。这是您在访问列值时要使用的名称。

让我们看一个简单的示例,在该示例中,我们将检索Authors列表,如下所示-

简单的例子

在此示例中,我们将获得“作者”列表,然后将“工资/费率”提高一些值。因此,对于Salary / Rate列,我们将使用InternalName

步骤1-转到服务器资源管理器;右键单击“ SharePoint连接”,然后选择“添加连接…”。指定URL,然后单击“确定”。

SharePoint连接

步骤2-展开SharePoint教程→列表库→列表→作者→字段→薪金/费率字段。右键单击“薪金/费率”,然后选择“属性”。您将在“属性”窗口中看到InternalName

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的列表,然后

  • 另一种方法是提高Rates,称为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 *。

我们可以使用所谓的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 =
            "" +
            "" +
            "";
         
         query.Query =
            "" +
            " " +
            "" +
            "" +
            " " +
            " " +
            " False" +
            " " +
            "";
         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