第一部分 服务器端上下文

一、HttpContext

这个……我想就不用再介绍了,SharePoint运行在标准的ASP.NET框架下(2003用的不是标准的ASP.NET 1.1,不过这年头还有人用2003么),所以这个对象的使用和ASP.NET没有任何区别。

二、SPContext

从名字就可以看出来,这个是SharePoint自己的上下文对象,它除了封装了HttpContext之外,提供了很多和SharePoint相关的上下文信息。

SPContext包含一个我们最经常使用的静态属性:SPContext.Current,用于获取当前的上下文信息(和HttpContext.Current类似,如果程序是运行在Web上的,就可以使用这个)。我见过不少初学SharePoint开发的人,在写WebPart的时候,还在使用new SPSite的方式来获取当前网站集,这即没有必要,也是对服务器资源的浪费(SPSite、SPWeb对象都包含非托管资源,而Current中的Site和Web是被SharePoint自己的运行时环境所管理的,可以快速取用)。

下面看一下这个SPContext中包含哪些常用的属性,可以在开发过程中使用(有些属性其实内部逻辑很复杂,这里简要介绍一些基本场景):

属性 说明
Site SPSite类型,次常用到的属性,当前的网站集
Web SPWeb类型,最常用到的属性,当前的网站。 
很多程序都是用SPContext.Current.Web来开头的……
List / ListId SPList / Guid类型,当前列表。 
不论你是在列表的视图页面上、表单页面上还是设置页面上,都可以通过这个属性取得当前的列表。其实只要Url查询里面有一个有效的List参数,参数的值是列表的Guid就可以。
ListItem / ItemId SPListItem / Int32类型,当前的列表条目。 
一般用于列表的查看和编辑表单(当然新建表单其实也可以,只不过没有ID),或者用于获取存放在页面库里的当前页面对应的条目。此外,如果当前的List属性有效的话,只要Url查询里面有一个有效的ID参数,就可以使用这个属性得到对应条目。
ListItemVersion SPListItemVersion类型,当前列表条目对应的版本。 
如果是从历史版本查看页面中,查看某个版本的条目时,在那个查看页面,可以用这个属性直接取到相应的版本。
ListItemDisplayName /
ListItemServerRelativeUrl
string / string类型,当前条目的显示名称(如果是普通列表,就是Title字段的值;如果是文档库,就是不带扩展名的文件名;或者是文件夹名称),以及Url。
File SPFile类型,如果当前条目是一个文件的话,这个属性可以直接得到文件对象。 
相当于SPContext.Current.ListItem.File
RootFolderUrl string类型,当前视图对应的Url地址。 
如果当前列表视图是处于列表的某个子文件夹中,可以通过这个属性得到这个文件夹的地址;否则的话,就是当前列表的根文件夹地址。
IsPopUI Boolean类型,判断当前页面是否在对话框中。 
仅限SharePoint 2010那种对话框,不包括浏览器的那种模态对话框。
FormContext SPFormContext类型,当前列表表单上下文(用于列表表单页面) 
一般可以使用这么几个属性: 
    FormMode:表单类型,New / Edit / Display 
    FieldControlCollection:表单上字段控件的集合
ViewContext SPViewContext类型,当前视图上下文(用于列表视图页面) 
一般可以使用这么几个属性: 
    View:SPView对象,当前的视图 
    ViewId:视图的Guid
ContextPageInfo SPContextPageInfo类型,当前页面上下文(用于页面库中的页面) 
一般可以使用这么几个属性: 
    ListId:页面所在文档库的Id 
    ItemId:当前页面作为列表条目的Id 
    BasePermissions:当前用户对当前页面的权限 
    IsWebWelcomePage:当前页面是否是网站的首页

第二部分 客户端 上下文

一、JavaScript中的“ctx”

这个在微软的SDK里面是没有提及到的,在所有包含列表视图的Web部件页上,每个列表视图都会对应一个ctx[blabla]的JavaScript变量,后面那个[blabla]是一个数字,这个数字也是这个变量的ctxId属性。这些ctx变量都放在一个全局JavaScript变量g_ctxDict这个对象中,其key就是变量名字符串,value就是这个变量,因此便利这个全局变量,就能通过JavaScript找到当前页面中的所有视图。

ctx变量名义上是一个叫ContextInfo的JavaScript“类”,它包含非常丰富的属性,常用的一些如下:

属性 说明
ctxId 一个标识此变量的数字,比如185,那么这个变量就是ctx185。使用的时候可以用ctx185或者g_ctxDict[‘ctx185’]来找到这个变量(某些情况下有种更简便的方法,后面再说)。需要注意的是,每次刷新页面的时候,这个标识可能是会变的,具体原理我暂时木有去深究。
listBaseType 列表的基础类型,相当于SPList的BaseType属性
listTemplate 列表的模版Id(比如文档库是101、通知是104),相当于SPList的BaseTemplate属性
listName 列表的Id,不要被变量名混淆了
view 列表视图的Id
listUrlDir 列表的根路径,相当于spList.RootFolder.ServerRelativeUrl
HttpRoot 当前网站的根路径(绝对路径)
SiteTitle 当前网站的标题
ListTitle 列表的标题(这个才是标题,listName不是)
CurrentUserId 当前用户的Id
wpq[*] 渲染视图那个WebPart的ID,比如WPQ2
ListData[*] 这个就厉害了,这个属性指向一个数组,而这个数组就是当前视图显示的那些列表条目,包含各个字段的值,JSON格式。
ListSchema[*] 列表各个字段的定义(包含字段名称、字段类型等等),JSON格式。
BasePermissions[*] 当前用户对这个列表的基本权限,形如下面这种样子: 
{ManageLists: true, ManagePersonalViews: true, OpenItems: true}

后面加[*]的那几个是SharePoint 2013新增的属性。

其实在包含列表视图的页面中,还有一个名字就叫“ctx”的变量,它指向这个页面中最后一个ctx[blabla]变量,因此如果页面中只有一个列表视图的话,就可以直接使用ctx。比如在某个列表视图页面中,你想看一下这个列表模版的Id是多少,就可以直接在浏览器地址栏里输入:javascript:alert(ctx.listTemplate) ,嗯。

ctx变量最主要的作用,就是生成列表项的那个下拉菜单(ECB – Edit Control Block),如果你去翻那个corev4.js的话,就可以看到在创建那个下拉菜单的时候,ctx是作为参数传进去的。如果需要自定义列表项菜单的话,除了使用Feature的方式、或者2010新增的那个通过SPD添加Custom Action的方式,还可以使用从2007时代延续下来的JavaScript方式:在页面中添加Custom_AddListMenuItems方法或者Custom_AddDocLibMenuItems方法(具体使用请自行搜索),而ctx就是这两个方法的参数之一。

除此之外,作为列表视图中重要的JavaScript变量,通过在页面中嵌入的一些脚本中使用ctx,还可以完成各种比较邪恶的事情,请大家自行发挥想象。

二、JavaScript中的_spPageContextInfo变量

同样是一个没有文档的JavaScript变量,虽然名字和前面提到的某个服务器端类型差不多,但是这个JavaScript变量里面所包含的内容,要比SPContextPageInfo多很多,它包含如下一些常用属性:

属性 说明
webServerRelativeUrl 网站的相对服务器路径(“/”开头)
currentLanguage 当前网站的语言LCID
webUIVersion 当前网站的UI风格(2010/2013风格是4,如果母板页是2007风格是3)
pageListId 页面库的列表Id
pageItemId 如果当前页面是在页面库中的话,当前页面作为列表条目的Id
webAbsoluteUrl[*] 网站绝对路径(“http://”或者“https://”开头)
siteAbsoluteUrl[*] 网站集绝对路径(“http://”或者“https://”开头)
layoutsUrl[*] layouts的相对服务器路径(2013其实有两个layouts root路径,一个是15,一个是14)
webTitle[*] 网站标题
webPermMasks[*] 当前用户对当前网站的权限,形如:{High:2147483647,Low:4294967295}
(因为JavaScript不支持64位整数,所以把高位和地位拆开了)
siteServerRelativeUrl[*] 网站集的相对服务器路径(“/”开头)

后面加[*]的那几个是SharePoint 2013新增的属性。

  如果想在JavaScript或者JQuery里使用的话,直接如下方法使用就可以了;

  var siteUrl = _spPageContextInfo.webAbsoluteUrl;

_spPageContextInfo 完整对象如下图,需要什么属性,可以自己获取,然后在代码中使用了。

_spPageContextInfo {
    [functions]: ,
       alertsEnabled: false,
        allowSilverlightPrompt: "True",
        clientServerTimeDelta: -447,
        crossDomainPhotosEnabled: false,
        currentCultureName: "en-US",
        currentLanguage: 2052,
        currentUICultureName: "zh-CN",
        isAppWeb: false,
        isSiteAdmin: true,
        layoutsUrl: "_layouts/15",
        pageItemId: 1,
        pageListId: "{20b11cdc-7008-4c2f-89d6-d7c2ad57cca0}",
        pagePersonalizationScope: 1,
        ProfileUrl: "http://moss:80/my/Person.aspx",
        serverRequestPath: "/SitePages/主页.aspx",
        siteAbsoluteUrl: "http://moss",
        siteClientTag: "13$$16.0.4327.1000",
        siteServerRelativeUrl: "/",
        systemUserKey: "S-1-0-0",
        tenantAppVersion: "0",
        updateFormDigestPageLoaded: [date] Fri Feb 1 15: 59: 00 UTC + 0800 2019,
        userId: 1073741823,
        userLoginName: "SHAREPOINT\system",
        webAbsoluteUrl: "http://moss",
        webLanguage: 2052,
        webLogoUrl: "_layouts/15/images/siteicon.png",
        webPermMasks: {},
        webServerRelativeUrl: "/",
        webTemplate: "1",
        webTitle: "开发网站",
        webUIVersion: 15
}

三、其他JavaScript全局变量

页面中其实还有一些全局的JavaScript变量,也可以获取到当前的一些上下文信息:

变量 说明
g_wsaLCID 当前的语言,相当于_spPageContextInfo.currentLanguage
g_wsaSiteTemplateId 当前网站所使用的站点模版,比如“STS#1”表示工作组网站
_spUserId 当前用户的Id,这个JavaScript变量其实是右上角那个欢迎菜单渲染出来的
_spWebPermMasks 当前用户对当前网站的权限,相当于_spPageContextInfo.webPermMasks

第三部分 MS的官方参考

一、SharePoint 命名空间

https://docs.microsoft.com/zh-cn/previous-versions/office/sharepoint-csom/ee544361%28v%3doffice.15%29

https://docs.microsoft.com/zh-cn/previous-versions/office/sharepoint-csom/ee544361(v=office.15)

二、SharePoint 开发

https://docs.microsoft.com/zh-cn/sharepoint/dev/

《SharePoint 漫谈》https://iiunknown.gitbooks.io/sharepoint-ramble-wechat/content/index.html

【转】SharePoint开发中可能用到的各种Context(上下文)相关推荐

  1. SharePoint开发中怎样使用Visual Studio给你的Web Part加入图标

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u012025054/article/details/36051545 SharePoint开发中怎样 ...

  2. 了解 SharePoint 2010 开发中的关键点

    **摘要:**了解为 Microsoft SharePoint 2010 规划和开发业务解决方案时必须做出的关键点. 上次修改时间: 2012年3月13日 适用范围: Business Connect ...

  3. Visual Studio 2010 中的 SharePoint 开发

    Chai同学已经在他的blog上贴了文章,讲述VS2010中,针对SharePoint开发的一些增强.虽说VS2010还有一点点远,但是先了解一下也是不错的.嗯,在VS2008上,应该至少还会发布一个 ...

  4. SharePoint 2013 中的新增功能(与开发有关)

    了解 SharePoint 2013 中的新增特性和功能,包括新的云应用程序模型.开发工具.平台增强功能.移动应用程序以及更多其他功能. 适用范围: 云应用程序模型 SharePoint 2013 引 ...

  5. SharePoint 2010中的客户端AJAX应用——ASP.NET AJAX模板

    WCF Data Services是SharePoint 2010中一个极具吸引力的新特性.然而,因为它的强大,直接对其进行编程仍然会有点痛苦.幸运的是,一个新的相关技术 -- ASP.Net AJA ...

  6. SharePoint 2013 中如何使用Silverlight

    1.打开VS,创建一个Silverlight程序,如下图: 2.配置选择默认的,当然也可以不勾选Host Application,如下图: 3.添加Silverlight控件,2个label和1个bu ...

  7. 如何在SharePoint Server中整合其他应用系统?

    说到在SharePoint Server中整合其他应用系统,其实是一个挺复杂的问题,需要考量多方面的问题,并在各种选项中做出最佳的选择.在这篇blog中,将SharePoint Server在整合这方 ...

  8. 手动将自定制的WebPart部署到 SharePoint 2010 中

    1.搭建好开发环境,建立webpart工程,写代码. 2.修改assembly.cs文件   在部署前,需要修改assembly文件,增加以下两句: using System.Security; [a ...

  9. 在 SharePoint 2013 中选择正确的 API 集

    决定使用哪个 API 集的因素 您可以在多个 API 集中选择一个来访问 SharePoint 2013 平台.您使用哪一个 API 集取决于以下因素: 应用程序的类型. 可能的类型包括但不限于以下不 ...

最新文章

  1. 【转载】tkinter多线程防假死
  2. translate动画
  3. 【渝粤题库】广东开放大学 传播学理论与实务 形成性考核
  4. 手机连接投影机的步骤_投影机安装过程详解
  5. 微服务难点剖析 | 服务拆的挺爽,问题是日志该怎么串联起来呢?
  6. github 创始人_GitHub联合创始人Scott Chacon的视频采访,探讨代码之外的未来
  7. NIPS不改名再引风波:签名抗议活动开启,大咖纷纷发声支持
  8. 关于DSP数字信号处理技术
  9. 解决jinjia2 for循环变量作用域问题
  10. import math java_java 中 Math类
  11. 建立自己的机器人手臂-组装
  12. adb命令重置_ADB命令手册大全
  13. 自动驾驶仿真软件简介----CARLAGazeboLGSVLOthers
  14. 【C语言】PAT乙级:1005 继续(3n+1)猜想
  15. 使用J-OCTA软件探索锂离子电池新材料
  16. 【原创】遥感影像法分析河流演变
  17. 程序无法启动因为计算机丢失msvcr110,解决启动Apache时出现因为计算机丢失MSVCR110.dll文件...
  18. 电商商品规格选择逻辑
  19. 星号塔php,PHP实现星号金字塔代码分享
  20. 十大算法之克鲁斯卡尔算法

热门文章

  1. Django里面是文件静态化的方法
  2. linq to json for sl
  3. oracle控制文件全备失败,Oracle数据库案例整理-恢复数据库失败-主备机控制文件所在目录不同...
  4. python博客编程_python编程
  5. 5d4的白平衡模式_佳能5D4/5D3/6D2系列中高端单反相机和全画幅微单EOS R专题系列课程...
  6. apicloud项目怎么运行_Spring Boot教程(3) – 运行第一个项目
  7. 3485. 最大异或和
  8. linux消息框架,远程处理器消息框架 - 基于Linux 简化 AMP 配置使其更方便更动态地分配资源...
  9. AD16 SCH原理图打开正常,PCB图纸打开为空白或仍是上一个界面的解决方法
  10. 小甲鱼c语言课后作业_知识,就是力量——山财“学习小课堂”助你蓄力