我正在通过开发SharePoint 2010网站的编辑器可用的自定义功能区选项卡,组,控件和命令,将外部应用程序集成到SharePoint 2010.功能区命令使用对话框框架打开包含自定义应用程序页面的对话框.
为了将大量查询字符串参数传递给自定义应用程序页面,我因此在客户端对象模型(ECMAScript)中寻找等效的SPContext.Current.ListItem.
关于可以在声明性XML中使用的可用令牌(即{ListItemId}或{SelectedItemId}),我已经发出了所有令牌,但不幸的是,在发布页面的上下文中,所需的令牌既不会被解析也不会被解析为null (即http://domain/pages/page.aspx).因此,没有任何渲染的tokes用于在应用程序页面中建立调用SPListItem的上下文.
查看SP.ClientContext.get_current()提供了大量有关当前SPSite,SPWeb等的信息,但没有关于我当前定位的当前SPListItem(再次,在发布页面的上下文中呈现页面) .
到目前为止我想出的是传递当前页面的url(即document.location.href)并在应用程序页面中解析它的想法 – 但是,感觉我走错了方向,SharePoint当然应该能够提供这些信息.
解决方法:
我不确定这是一个很好的答案,甚至完全是主题,但基本上我原本打算博客 – 无论如何:
客户端OM似乎没有提供具有当前SPListItem的细节的方法/属性,这确实是一种痛苦.但是,我冒昧地说这是一个简单的概念,但实际上在SharePoint中具有相当广泛的含义,直到你停下来思考它才会显现出来.
考虑:
>虽然存在重定向,但可以在2个或3个不同的URL上显示讨论帖(例如Threaded.aspx / Flat.aspx)
>同样,一对博客上可以存在一篇博文(Post.aspx / EditPost.aspx,也许还有一篇)
>列表项显然有DispForm.aspx / EditForm.aspx和(有点)NewForm.aspx
>对于具有关联SPFile的项目(例如文档,发布页面),请考虑这些URL代表相同的项目:
http://mydomain/sites/someSite/someLib/Forms/DispForm.aspx?ID=x,http://mydomain/sites/someSite/someLib/Filename.aspx
>此外,在此集合之外可能还有其他内容类型具有类似的交易
在我们的例子中,我们希望将数据“挂起”内部和外部项目(例如,喜欢,评论).我们认为“SharePoint中的所有内容都有一个URL,因此这可能是识别项目的明智方法”.很大的错误,我仍然在努力陷入其中.如果我们想以这种方式使用URL,那就好像我们需要API中的某种’normalizeUrl’方法.
您是否注意到Microsoft.SharePoint.Utilities中的PageUrlNormalization课程?听起来很有希望不是吗?不幸的是,这似乎做了一些我上面描述的事情 – 它不适用于内容类型等的变体(但确实处理扩展的Web应用程序,HTTP / HTTPS等).
简而言之,我们认为最好的方法是让服务器发出详细信息,这样我们就可以在传回服务器时识别当前的SPListItem(例如,在AJAX请求中).我们将“规范”列表项ID隐藏在JavaScript变量或隐藏的输入字段中(无论是什么),并在返回服务器时重新获取列表项进行评估.不如从上下文获取所有内容有效,但对我们而言,这是可以的,因为我们只需要在用户点击某些内容时解决,而不是在每个页面加载时解决.通过规范,我的意思是:
SiteID|WebID|ListID|ListItemID
IIRC,其中一个关键对象具有CanonicalId属性(或者可能是内部属性),它可以帮助您构建这样的字符串.
所以在使用window.location.href方面,如果你和我们的情况模糊不一,我会避免这种情况.建议考虑类似于我们使用的方法,但要记住有一些位置(例如某些形式)甚至在服务器上SPContext.Current.ListItem为null,尽管SPContext.Current.Web(可能还有SPContext)填充了.Current.List).
总之 – ID是您的朋友,URL不是.