zoukankan      html  css  js  c++  java
  • SharePoint开发中可能用到的各种Context(上下文)

    电脑正在以无比慢的速度从微软网站上安装Office Component for Visual Studio 2012,今晚的某个工作看来是干不成了,索性写篇blog。

    SharePoint是一个B/S结构的产品,所以在开发过程中会使用到各种各样的上下文(Context)信息,借此机会来总结一下。

    一、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
  • 相关阅读:
    x64 平台开发 Mapxtreme 编译错误
    hdu 4305 Lightning
    Ural 1627 Join(生成树计数)
    poj 2104 Kth Number(可持久化线段树)
    ural 1651 Shortest Subchain
    hdu 4351 Digital root
    hdu 3221 Bruteforce Algorithm
    poj 2892 Tunnel Warfare (Splay Tree instead of Segment Tree)
    hdu 4031 Attack(BIT)
    LightOJ 1277 Looking for a Subsequence
  • 原文地址:https://www.cnblogs.com/erucy/p/2655600.html
Copyright © 2011-2022 走看看