Вызов 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 следует выполнять следующие действия.
Создать запрос SQL с помощью прямого запроса SQL или хранимой процедуры.
Выполнить запрос SQL.
Прочитать результаты из 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.
См. также
Концепции
Объекты значения не могут быть использованы в методах запроса
Клиентские объекты можно использовать в методах запроса
Получение групповых данных из одного объекта
При получении клиентского объекта получаются не все свойства