在访问值属性之前调用 Load 和 ExecuteQuery

上次修改时间: 2010年2月9日

适用范围: SharePoint Foundation 2010

在 SharePoint Online 中提供

必须先对 ClientContext 对象 (JavaScript: ClientContext) 调用 Load<T>(T, []) 方法 (JavaScript: load(clientObject)) 和 ExecuteQuery()ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) 方法 (JavaScript: executeQueryAsync(succeededCallback, failedCallback)),才能访问客户端对象的值属性。

如果您熟悉 Microsoft SharePoint Foundation 2010 服务器对象模型,则可能会尝试编写使用客户端库的代码,其编写方式与编写使用服务器库的代码的方式相同。例如,如果要显示网站的标题,您可能会认为您可以编写类似如下 C# 示例中使用客户端库的代码。

错误代码

using System;
using Microsoft.SharePoint.Client;

namespace Microsoft.SDK.SharePointServices.Samples
{
    class WebSiteTitle
    {
        static void Main()
        {
            ClientContext clientContext = new ClientContext("http://MyServer/sites/MySiteCollection");
            Web oWebsite = clientContext.Web;
            Console.WriteLine(oWebsite.Title);
        }
    }
}

编译该代码将会返回 PropertyOrFieldNotInitializedException,这是因为尚未从服务器检索该属性的值。该示例返回异常的原因是客户端库使用了类似 SQL 的编程模式。在使用 SQL 时,您必须:

  1. 通过临时 SQL 查询或存储过程建立一个 SQL 查询。

  2. 执行该 SQL 查询。

  3. 从 SQL 读取结果。

客户端对象模型与 SQL 使用相同的模式。在调用方法时,即会使用客户端库建立查询。您可以建立查询,并且这些查询在执行之前可以累积,但在通过 Load<T>(T, []) 方法 (JavaScript: load(clientObject)) 首次加载适当的对象或属性,然后调用 ExecuteQuery()ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) 方法 (JavaScript: executeQueryAsync(succeededCallback, failedCallback)) 之前,您并没有将其发送给服务器。若要使上述代码起作用,您必须进行以下更改。

正确代码

using System;
using Microsoft.SharePoint.Client;

namespace Microsoft.SDK.SharePointServices.Samples
{
    class WebSiteTitle
    {
        static void Main()
        {
            ClientContext clientContext = new ClientContext("http://MyServer/sites/MySiteCollection");
            Web oWebsite = clientContext.Web;

            clientContext.Load(oWebsite,
                w=>w.Title);

            clientContext.ExecuteQuery();

            Console.WriteLine(oWebsite.Title);
        }
    }
}
Imports System
Imports Microsoft.SharePoint.Client

Namespace Microsoft.SDK.SharePointServices.Samples
    Class WebSiteTitle
      
        Shared Sub Main()
            Dim clientContext As New ClientContext("http://MyServer/sites/MySiteCollection")
             Dim oWebsite As Web = clientContext.Web
         
             clientContext.Load(oWebsite, Function(w) w.Title)
         
             clientContext.ExecuteQuery()
         
             Console.WriteLine(oWebsite.Title)
        End Sub
    End Class
End Namespace
function retrieveWebSite() {
    var clientContext = new SP.ClientContext('/sites/MySiteCollection');
    this.oWebsite = clientContext.get_web();

    clientContext.load(oWebsite, 'Title');

    clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}

function onQuerySucceeded() {
    alert('Title: ' + this.oWebsite.get_title());
}
    
function onQueryFailed(sender, args) {
    alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}

为了提高性能,添加到上述示例中的第一个方法调用将使用 LINQ 查询表达式来明确请求网站的 Title 属性 (JavaScript: title)。然后,第二个方法调用将执行该查询。这样一来,通过客户端对象模型指定网站标题的方式就与 SQL 命令 SELECT Title FROM Webs 类似。如果想要检索网站的所有属性,可以使用 clientContext.Load(oWebsite);,它与 SQL 命令 SELECT * FROM Webs 类似。

请参阅

概念

数据检索概述

值对象不能在查询中跨方法使用

可以在查询的各个方法之间使用客户端对象

对相同对象的数据检索分组

检索客户端对象并不会检索所有属性