Объекты значения не могут быть использованы в методах запроса
Дата последнего изменения: 27 мая 2011 г.
Применимо к: SharePoint Foundation 2010
Доступно на сайте SharePoint Online
При использовании метода или свойства для возврата значения, равно как при использовании объекта, который наследует от класса ClientValueObject (JavaScript: ClientValueObject), не допускается применять данное значение в этом же запросе в качестве параметра вызова другого метода. Дополнительную информацию по объектам значений см. в разделе Клиентские объекты, объекты значений и скалярные свойства.
Пример. Создается список SharePoint, отображаемый заголовок которого совпадает с заголовком сайта. Если вы знакомы с объектной моделью сервера SharePoint Foundation, то вы можете решить использовать следующий код.
Недопустимый код
using System;
using Microsoft.SharePoint.Client;
namespace Microsoft.SDK.SharePointServices.Samples
{
class CreateList
{
static void Main()
{
ClientContext clientContext = new ClientContext("http://MyServer/sites/MySiteCollection");
Web oWebsite = clientContext.Web;
ListCreationInformation listCreationInfo = new ListCreationInformation();
listCreationInfo.TemplateType = 104;
listCreationInfo.Title = oWebsite.Title;
List oList = oWebsite.Lists.Add(listCreationInfo);
clientContext.ExecuteQuery();
}
}
}
В процессе компиляции код вернет ошибку PropertyOrFieldNotInitializedException, так как "свойство или поле не было инициализировано". Данный пример возвращает ошибку, потому что свойство Title (JavaScript: title) объекта сайта не доступно перед вызовом ExecuteQuery(). Несмотря на то, что SQL позволяет объявить локальную переменную с заголовком сайта, а также использовать ее при создании списка, объявить локальную переменную в объектной модели клиента нет возможности. Для этого необходимо вызвать ExecuteQuery() или ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) (JavaScript: executeQueryAsync(succeededCallback, failedCallback)) дважды: сначала для возврата значения свойства Title (JavaScript: title), а затем для создания списка. Ниже приведен пример с изменениями.
Допустимый код
using System;
using Microsoft.SharePoint.Client;
namespace Microsoft.SDK.SharePointServices.Samples
{
class CreateList
{
static void Main()
{
ClientContext clientContext = new ClientContext("http://MyServer/sites/MySiteCollection");
Web oWebsite = clientContext.Web;
clientContext.Load(oWebsite,
w => w.Title);
clientContext.ExecuteQuery();
ListCreationInformation listCreationInfo = new ListCreationInformation();
listCreationInfo.TemplateType = 104;
listCreationInfo.Title = oWebsite.Title;
List oList = oWebsite.Lists.Add(listCreationInfo);
clientContext.ExecuteQuery();
}
}
}
Imports System
Imports Microsoft.SharePoint.Client
Namespace Microsoft.SDK.SharePointServices.Samples
Class CreateList
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()
Dim listCreationInfo As New ListCreationInformation()
listCreationInfo.TemplateType = 104
listCreationInfo.Title = oWebsite.Title
Dim oList As List = oWebsite.Lists.Add(listCreationInfo)
clientContext.ExecuteQuery()
End Sub
End Class
End Namespace
function getWebSiteTitle() {
this.clientContext = new SP.ClientContext('/sites/TestWebs/TestWeb1');
this.oWebsite = clientContext.get_web();
clientContext.load(oWebsite, 'Title');
clientContext.executeQueryAsync(Function.createDelegate(this, this.createList), Function.createDelegate(this, this.onQueryFailed));
}
function createList() {
var listCreationInfo = new SP.ListCreationInformation();
listCreationInfo.set_templateType(104);
listCreationInfo.set_title(oWebsite.get_title());
var oList = oWebsite.get_lists().add(listCreationInfo);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}
function onQuerySucceeded() {
alert('List created.');
}
function onQueryFailed(sender, args) {
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
См. также
Концепции
Вызов Load и ExecuteQuery перед доступом к свойствам значения
Клиентские объекты можно использовать в методах запроса
Получение групповых данных из одного объекта
При получении клиентского объекта получаются не все свойства