SharePoint 2013 应用开发实战
上QQ阅读APP看书,第一时间看更新

2.4 SPList、SPField和SPView对象

SharePoint网站的内容基本上是由各种各样的列表组成的,而表示这些列表的对象模型就是接下来要介绍的SPList对象。

2.4.1 SPList对象

列表是位于SharePoint网站中的,所以获取一个列表对象之前首先要做的是获取到列表所在的网站SPWeb对象,下面的代码展示了通过列表标题获取列表对象并打印出列表部分属性的方法:

    string listTitle = string.Empty;
    string listDescription = string.Empty;
    string listDefaultViewUrl = string.Empty;
    string listItemCount=string.Empty;
    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
              using (SPWeb web = site.OpenWeb())
              {
                    SPList list = web.Lists'"文档"';
                    listTitle = list.Title;
                    listDescription = list.Description;
                    listDefaultViewUrl = list.DefaultViewUrl;
                    listItemCount = list.ItemCount.ToString();
                    Console.WriteLine(string.Format("List Title: {0}; List
Description: {1}; List DefaultViewUrl: {2}; Item Count: {3}",
                       listTitle, listDescription, listDefaultViewUrl,
listItemCount));
              }
    }

上面的例子中,使用SPWeb对象web.Lists将获取网站对象下所有的列表对象集合,根据最佳实践的原则,这种方法是低效的,因为目标是获取一个指定的列表对象,但是使用此方法获得了整个网站下的列表集合,除了目标列表还获取了大量无用的列表对象。

推荐的做法是通过列表的URL参数获取到该列表对象,将SPList list = web.Lists'"文档"'修改为SPList list = web.GetList(web.Url + “/Shared Documents”)。但是在实际的应用中,可能只知道列表的标题,此时就只能借助集合获取列表对象了。

添加一个列表的方法跟添加一个网站的代码结构类似,需要指定列表的标题、列表的描述和列表的模板等属性,代码如下:

    string listTitle = string.Empty;
    string listDescription = string.Empty;
    string listDefaultViewUrl = string.Empty;
    string listItemCount = string.Empty;
    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
              using (SPWeb web = site.OpenWeb())
              {
                    Guid listID = web.Lists.Add("代码创建的文档库标题", "代码创建的文档
库描述", SPListTemplateType.DocumentLibrary);
                    SPList list = web.Lists'listID';
                    listTitle = list.Title;
                    listDescription = list.Description;
                    listDefaultViewUrl = list.DefaultViewUrl;
                    listItemCount = list.ItemCount.ToString();
                    Console.WriteLine(string.Format("List Title: {0}; List
Description: {1}; List DefaultViewUrl: {2}; Item Count: {3}",
                       listTitle, listDescription, listDefaultViewUrl,
listItemCount));
             }
    }

添加列表的方法执行成功之后会返回新列表的Guid,用这个ID进行列表对象获取的操作,然后可以获取列表的部分属性。

添加完列表之后,如果要对这个列表的属性进行修改,可以获取这个列表对象,对其属性进行修改之后调用Update方法提交修改:

    string listTitle = string.Empty;
    string listDescription = string.Empty;
    string listDefaultViewUrl = string.Empty;
    string listItemCount=string.Empty;
    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
              using (SPWeb web = site.OpenWeb())
              {
                    SPList list = web.Lists'"代码创建的文档库标题"';
                    list.Title = "代码创建的文档库标题改";
                    list.Description = "代码创建的文档库描述改";
                    list.Update();
                    listTitle = list.Title;
                    listDescription = list.Description;
                    listDefaultViewUrl = list.DefaultViewUrl;
                    listItemCount = list.ItemCount.ToString();
                    Console.WriteLine(string.Format("List Title: {0}; List
Description: {1}; List DefaultViewUrl: {2}; Item Count: {3}",
                       listTitle, listDescription, listDefaultViewUrl,
listItemCount));
                    Console.ReadKey();
              }
    }

接下来删除刚才创建的列表,同样需要借助SPWeb对象的Lists属性集合来进行操作,代码如下:

    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
              using (SPWeb web = site.OpenWeb())
              {
                    SPList list = web.Lists'"代码创建的文档库标题改"';
                    list.Delete();
              }
    }

如果读者有过传统ASP.NET数据库系统的开发经验,那么大可将列表看成是类似SQL数据表的东西,并且实际上SharePoint上的内容也都是存储在SQL数据库中的,笔者建议读者参照SQL数据表去理解SharePoint列表,印象会更深刻。

2.4.2 SPField和SPView对象

就像有了表就需要有字段一般,SharePoint有了列表就需要有相应的栏,这就是SharePoint中栏的概念,实际上栏就是SharePoint列表的字段,表明这个列表有哪些属性。在服务器端对象模型中,与之对应的对象编程模型叫做SPField。

SQL数据表的字段有多种数据类型,同样列表栏也有多种数据类型,基本可以与SQL数据表字段的数据类型对应。具体的数据类型可以在列表管理页面点击创建栏的弹出窗体中看到,这里不做细致讲述。

同样的角度也可以用来理解SPView对象模型,可以把它看作是类似SQL视图的东西,只不过视图的范围仅局限于列表内部。SharePoint列表的视图用来决定显示列表中的哪些栏,不同的视图可以有不同的栏组合、筛选、排序和分组条件,这些条件由CAML语句定义,关于CAML语句和列表查询相关的内容,将在后面的章节进行阐述。

与之前列表要基于网站一个道理,栏要基于列表,讲SPField和SPView这两个对象的使用之前,为了便于读者理解,笔者在网站中创建了一个自定义列表。自定义列表是SharePoint中最基本的列表,默认只带一个标题栏。列表的名称是自定义列表,列表URL为/Lists/List/AllItems.aspx,列表的默认视图为所有项目视图。如图2-10所示。

图2-10 全新的自定义列表

下面的代码演示获取该自定义列表的标题栏和默认视图并输出部分属性,输出结果如图2-11所示。

图2-11 自定义列表标题栏的部分属性输出

    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
              string fieldTitle = string.Empty;
              string fieldDescription = string.Empty;
              string fieldTypeDisplayName = string.Empty;
              string viewTitle = string.Empty;
              string viewUrl = string.Empty;
              using (SPWeb web = site.OpenWeb())
              {
                    SPList customList = web.GetList(web.Url + "/Lists/List/");
                    SPField titleField = customList.Fields.GetField("标题");
                    fieldTitle = titleField.Title;
                    fieldDescription = titleField.Description;
                    fieldTypeDisplayName =
titleField.FieldTypeDefinition.TypeDisplayName;
                    SPView defaultView = customList.DefaultView;
                    viewTitle = defaultView.Title;
                    viewUrl = defaultView.Url;
                    Console.WriteLine(string.Format("Filed title: {0}; Field
description: {1}; Field Type Name: {2}",
                       fieldTitle, fieldDescription, fieldTypeDisplayName));
                    Console.WriteLine(string.Format("View title: {0}; View Url:
{1}", viewTitle, viewUrl));
              }
    }

列表只有一个栏未免有些太枯燥了,下面给该列表添加一个多行文本框类型的栏,将它变成一个可用于发布通知公告的列表:

    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
              using (SPWeb web = site.OpenWeb())
              {
                    SPList customList = web.GetList("/Lists/List/");
                    string fieldInternalName = customList.Fields.Add("内容",
SPFieldType.Note, true);
                    customList.Update();
              }
    }

细心的读者会发现代码执行完之后在列表的默认视图中并没有看到添加的栏。这是因为添加操作仅负责将栏添加到列表中,此时新添加的栏并没有作为默认视图的显示栏显示出来。下面的代码将展示如何完成这个操作并对栏的标题进行简单的修改:

    using (SPSite site = new SPSite("http://<mysiteurl>/subSite"))
    {
              using (SPWeb web = site.OpenWeb())
              {
                    SPList customList = web.GetList(web.Url + "/Lists/List/");
                    SPField contentField = customList.Fields.GetField("内容");
                    contentField.Title = "公告内容";
                    contentField.Update();
                    SPView defaultView = customList.DefaultView;
                    defaultView.ViewFields.Add(contentField);
                    defaultView.Update();
              }
    }

执行完上述操作后列表如图2-12所示。

图2-12 代码执行后的自定义列表

对于列表栏和视图的删除跟之前介绍的一样,获取到对象之后执行Delete方法,这里不再赘述。

关于SPField对象还有一点需要说明。在服务器端对象模型中的列表栏部分,SPField是作为一个基类存在的,开发人员在平时的开发中使用它可以满足基本的操作。实际上对于列表栏的每个数据类型,都有一个与之对应的SPFieldXXX对象,比如上文演示中创建的Note类型,准确地说该栏对应的是SPFieldMultiLineText对象。在开发过程中如果需要细致地对每个栏进行定制化操作,笔者推荐使用精准的类型去操作。获取这些对象可采用C#的as关键字在获取到SPField对象之后进行转换,如:

    SPFieldMultiLineText contentField = customList.Fields.GetField("公告内容") as
SPFieldMultiLineText;

这样就可以使用SPFieldMultiLineText对象特有的RichText和RichTextMode等属性了。