设为首页 收藏本站
查看: 945|回复: 0

[经验分享] SharePoint开发中可能用到的各种Context(上下文)

[复制链接]

尚未签到

发表于 2015-9-24 09:14:21 | 显示全部楼层 |阅读模式
  电脑正在以无比慢的速度从微软网站上安装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中包含哪些常用的属性,可以在开发过程中使用(有些属性其实内部逻辑很复杂,这里简要介绍一些基本场景):
  
属性说明
SiteSPSite类型,次常用到的属性,当前的网站集
WebSPWeb类型,最常用到的属性,当前的网站。         
很多程序都是用SPContext.Current.Web来开头的……
List / ListIdSPList / Guid类型,当前列表。         
不论你是在列表的视图页面上、表单页面上还是设置页面上,都可以通过这个属性取得当前的列表。其实只要Url查询里面有一个有效的List参数,参数的值是列表的Guid就可以。
ListItem / ItemIdSPListItem / Int32类型,当前的列表条目。         
一般用于列表的查看和编辑表单(当然新建表单其实也可以,只不过没有ID),或者用于获取存放在页面库里的当前页面对应的条目。此外,如果当前的List属性有效的话,只要Url查询里面有一个有效的ID参数,就可以使用这个属性得到对应条目。
ListItemVersionSPListItemVersion类型,当前列表条目对应的版本。         
如果是从历史版本查看页面中,查看某个版本的条目时,在那个查看页面,可以用这个属性直接取到相应的版本。
ListItemDisplayName /         
ListItemServerRelativeUrl
string / string类型,当前条目的显示名称(如果是普通列表,就是Title字段的值;如果是文档库,就是不带扩展名的文件名;或者是文件夹名称),以及Url。
FileSPFile类型,如果当前条目是一个文件的话,这个属性可以直接得到文件对象。         
相当于SPContext.Current.ListItem.File
RootFolderUrlstring类型,当前视图对应的Url地址。         
如果当前列表视图是处于列表的某个子文件夹中,可以通过这个属性得到这个文件夹的地址;否则的话,就是当前列表的根文件夹地址。
IsPopUIBoolean类型,判断当前页面是否在对话框中。         
仅限SharePoint 2010那种对话框,不包括浏览器的那种模态对话框。
FormContextSPFormContext类型,当前列表表单上下文(用于列表表单页面)         
一般可以使用这么几个属性:         
    FormMode:表单类型,New / Edit / Display         
    FieldControlCollection:表单上字段控件的集合
ViewContextSPViewContext类型,当前视图上下文(用于列表视图页面)         
一般可以使用这么几个属性:         
    View:SPView对象,当前的视图         
    ViewId:视图的Guid
ContextPageInfoSPContextPageInfo类型,当前页面上下文(用于页面库中的页面)         
一般可以使用这么几个属性:         
    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

  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-118016-1-1.html 上篇帖子: 无废话SharePoint入门教程三[创建网站集和网站] 下篇帖子: Sharepoint学习笔记---Sandbox Solution-- Full Trust Proxy--开发步骤
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表