使用客户端对象模型从Sharepoint 2010中的当前视图/过滤器获取项目

时间:2012-10-08 00:31:14

标签: sharepoint view client-object-model

如何才能获得用户当前视图/过滤器中的项目?使用Sharepoint 2010客户端对象模型(即Javascript / ECMAScript)。

用户可以选择显示库或列表中可用项目子集的视图,然后他们可以将过滤器应用于一个或多个列。我希望得到所有过滤的最终结果。我想在所有页面中为用户显示所有项目。

我已经看到很多示例代码依赖于知道当前视图以构建查询 - 在这种情况下这并没有真正帮助。我已经知道如何获得所选项目,例如

SP.ListOperation.Selection.getSelectedItems(SP.ClientContext.get_current());

但是,这只会选择当前页面中的项目。

谢谢!

2 个答案:

答案 0 :(得分:2)

Sibirman的首选答案只会返回视图的原始查询。当用户应用过滤器操作时,用户指定的过滤器实际上附加到URL(作为InplviewHash字符串的一部分)。

e.g。 #InplviewHashf16272c0-c177-42d7-9638-35fd75c90348 = WebPartID%3D%7BF16272C0 - C177--42D7--9638--35FD75C90348%7D-的 FilterField1 %3DProjectRef-的 FilterValue1 %3DProject%25201-的 FilterField2 %3DAddress-的 FilterValue2 %3DPilbara

INPLVIEW.js中的函数和/ _layouts中的其他SP JavaScript文件包含解码此函数和重新初始化视图的函数,但我无法解读所有这些函数。

DecodeHashAsQueryString和InitGridFromView是一个很好的起点。

我最后编写自己的代码来检查哈希字符串,然后删除键/值对。

var uri = window.location.href;
var hashIndex = uri.search("#");

var filter = false;
if (hashIndex == -1) {
  // Wasn't found
  alert('No filters applied!');
  // ...go with default query.
} else {
  // # found. Get hashstring
  var hashStr = uri.substring(hashIndex);
  newStr = DecodeHashAsQueryString(hashStr);

  var trStr = newStr.substring(newStr.indexOf("FilterField"));
  var retStr = trStr.replace(/%3D|&/g,",").replace(/%2520/g," ");
  retStr = retStr.replace(/FilterField[0-9]+,|FilterValue[0-9]+,/g,"")
  var filtArray = retStr.split(','); // "MyField1","MyValue1",...

并将它们应用于我自己的查询,但不包含限制,因此返回的所有项目都符合过滤条件。

如果您想要处理文本opr选择以外的字段,您需要更进一步并获取字段类型,以便您可以根据需要修改每个字段的查询值类型。

答案 1 :(得分:1)

您可以通过两个请求来完成:

function getItemsFromView(listTitle, viewTitle)
{

    var context = new SP.ClientContext.get_current();
    var list = context.get_web().get_lists().getByTitle(listTitle);
    var view = list.get_views().getByTitle(viewTitle);
    context.load(view);

    context.executeQueryAsync(
        function(sender, args) {getItemsFromList(listTitle, "<View><Query>" + view.get_viewQuery() + "</Query></View>")},
        function(sender, args) {alert("error: " + args.get_message());}
    );
}

function getItemsFromList(listTitle, queryText) 
{
    var context = new SP.ClientContext.get_current();
    var list = context.get_web().get_lists().getByTitle(listTitle);

    var query = new SP.CamlQuery();
    query.set_viewXml(queryText);

    var items = list.getItems(query);

    context.load(items);
    context.executeQueryAsync(
        function()
        {
            var listEnumerator = items.getEnumerator();
            var i = 0;
            while (listEnumerator.moveNext())
            {
                i++;
            }
            alert("items retrieved: " + i);
        },
        function(sender, args) {alert("error in inner request: " + args.get_message());}
   );

}