Вызов Load и ExecuteQuery перед доступом к свойствам значения

Дата последнего изменения: 9 февраля 2010 г.

Применимо к: SharePoint Foundation 2010

Доступно на сайте SharePoint Online

Перед доступом к свойствам значений клиентского объекта нужно вызвать метод Load<T>(T, []) (JavaScript: load(clientObject)) и ExecuteQuery() или метод ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) (JavaScript: executeQueryAsync(succeededCallback, failedCallback)) объекта ClientContext (JavaScript: ClientContext).

Если разработчик знаком с серверной объектной моделью 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) method (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.

См. также

Концепции

Обзор извлечения данных

Объекты значения не могут быть использованы в методах запроса

Клиентские объекты можно использовать в методах запроса

Получение групповых данных из одного объекта

При получении клиентского объекта получаются не все свойства