[转]SharePoint开发中可能用到的各种Context(上下文)
SharePoint是一个B/S结构的产品,所以在开发过程中会使用到各种各样的上下文(Context)信息,借此机会来总结一下。特别是Javascript的Ctx非常实用,这里记录一下!
一、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新增的属性。
_spPageContextInfo变量主要的使用场景,就是在JavaScript中获取当前页面的一些基本信息,尤其在发布页面中,会有比较多的使用价值。
五、其他JavaScript全局变量
页面中其实还有一些全局的JavaScript变量,也可以获取到当前的一些上下文信息:
| 变量 | 说明 |
| g_wsaLCID | 当前的语言,相当于_spPageContextInfo.currentLanguage |
| g_wsaSiteTemplateId | 当前网站所使用的站点模版,比如“STS#1”表示工作组网站 |
| _spUserId | 当前用户的Id,这个JavaScript变量其实是右上角那个欢迎菜单渲染出来的 |
| _spWebPermMasks | 当前用户对当前网站的权限,相当于_spPageContextInfo.webPermMasks |
[转]SharePoint开发中可能用到的各种Context(上下文)的更多相关文章
- SharePoint开发中可能用到的各种Context(上下文)
转载: http://www.cnblogs.com/erucy/archive/2012/08/25/2655600.html 电脑正在以无比慢的速度从微软网站上安装Office Component ...
- SharePoint开发中怎样使用Visual Studio给你的Web Part加入图标
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u012025054/article/details/36051545 SharePoint开发中怎样 ...
- 在C#开发中如何使用Client Object Model客户端代码获得SharePoint 网站、列表的权限情况
自从人类学会了使用火,烤制的方式替代了人类的消化系统部分功能,从此人类的消化系统更加简单,加速了人脑的进化:自从SharePoint 2010开始有了Client Side Object Model ...
- SharePoint 2010中使用Visual Studio 2010进行方便快速的Web Part开发
转:http://www.cnblogs.com/fatwhale/archive/2010/02/24/1672633.html 在Visual Studio 2010中, 已经集成了用于Shar ...
- Visual Studio 中的 Office 和 SharePoint 开发
MSDN Library 开发工具和语言 Visual Studio 中的 Office 和 SharePoint 开发 https://msdn.microsoft.com/zh-cn/libra ...
- 如何生成报告来枚举出整个sharepoint环境中的每个页面所使用的所有webpart
背景 我的公司的SharePoint环境中购买了大量的第三方webpart,比如Quick Apps, Telerik RadEditor, Nintex Workflow等等..这样做的好处就是成本 ...
- SharePoint 2013 中的 PowerPoint Automation Services
简介 许多大型和小型企业都将其 Microsoft SharePoint Server 库用作 Microsoft PowerPoint 演示文稿的存储库.所有这些企业在 ...
- 在 SharePoint 2013 中选择正确的 API 集
决定使用哪个 API 集的因素 您可以在多个 API 集中选择一个来访问 SharePoint 2013 平台.您使用哪一个 API 集取决于以下因素: 应用程序的类型. 可能的类型包括但不限于以 ...
- SharePoint 2013 中如何使用Silverlight
1.打开VS,创建一个Silverlight程序,如下图: 2.配置选择默认的,当然也可以不勾选Host Application,如下图: 3.添加Silverlight控件,2个label和1个bu ...
随机推荐
- .NET Core尝试
Dotnet Github网站 http://dotnet.github.io/getting-started/ 微软ASP.NET站点 https://docs.asp.net/en/lates ...
- MySQL的pt-query-digest的下载与使用
对于脚本文件,是可以执行的,我们不用安装.所以,但是这个脚本文件没有执行的权限,所以,我们首先赋予这个脚本文件的可执行的权限. 再次查看文件的信息后. 已经有了执行的权限了. 运行脚本的时候,可要注意 ...
- mysql join 查询图
mysql join 查询,特别是对查两个表之间的差集,可以用table字段=null来做. 注意千万不是join on XX!=XX ,这样出来的结果是错误的.
- PHP读取大文件的几种方法介绍
读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办 ...
- GCD使用dispatch_group_notify、dispatch_group_enter、dispatch_group_leave处理多线程同步操作
一.简介 dispatch_group_enter:通知group,下面的任务马上要放到group中执行了. dispatch_group_leave:通知group,任务完成了,该任务要从group ...
- atitit.html5 拼图游戏的解决之道.
atitit.html5 拼图游戏的解决之道. 1. 拼图游戏的操作(点击法and 拖动法) 1 1. 支持键盘上.下.左.右键移动: 1 2. 支持点击空白模块中的上下左右箭头移动: 1 3. 支持 ...
- SQL问题集锦
1.union和union all的区别:http://www.cnblogs.com/xiangshu/articles/2054447.html
- js命名规范
- JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法
在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,远哥目前找到了2种方法. 这2种方式都可以实现不用persist ...
- 【地图API】地址录入时如何获得准确的经纬度?淘宝收货地址详解
用户需求:管理者需要录入一批商户,并在地图上把商户展示出来.但发现一些商户的地址描述并不清楚,导致商户位置出错.如何获得更加准确的商户位置呢? 分析:假设地址准确的,可以通过地址解析,得到准确的经纬度 ...