Les objets valeur ne sont pas utilisables entre méthodes dans une requête
Dernière modification : vendredi 27 mai 2011
S’applique à : SharePoint Foundation 2010
Disponible dans SharePoint Online
Lorsque vous utilisez une méthode ou une propriété pour retourner une valeur, ou un objet qui hérite de la classe ClientValueObject (JavaScript: ClientValueObject), vous ne pouvez pas utiliser la valeur en tant que paramètre pour un autre appel de méthode dans la même demande. Pour plus d’informations sur les objets valeur, voir Objets clients, objets de valeur et propriétés scalaires.
Par exemple, supposons que vous souhaitez créer une liste SharePoint dont le nom affiché est le titre du site Web. Si vous êtes familiarisé avec le modèle objet serveur SharePoint Foundation, vous pourriez être tenté d’écrire le code de la manière suivante.
Code incorrect
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();
}
}
}
La compilation du code retourne une exception PropertyOrFieldNotInitializedException pour propriété ou champ non initialisé. L’exemple retourne une exception parce que la propriété Title (JavaScript: title) de l’objet site Web n’est pas disponible avant l’appel à ExecuteQuery(). Bien que SQL vous permette de déclarer une variable locale qui contient le titre du site Web et d’utiliser cette variable dans la création de liste, vous ne pouvez pas déclarer une variable locale dans le modèle objet client. Par conséquent, vous devez appeler ExecuteQuery() ou ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) (JavaScript: executeQueryAsync(succeededCallback, failedCallback)) deux fois, d’abord pour retourner la valeur de la propriété Title (JavaScript: title), puis pour créer la liste, comme indiqué dans l’exemple corrigé suivant.
Code correct
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());
}
Voir aussi
Concepts
Vue d'ensemble de la récupération des données
Appeler Load et ExecuteQuery avant d’accéder aux propriétés de valeur
Les objets clients peuvent être utilisés à travers les méthodes dans une requête
Récupération de données de groupe sur le même objet
La récupération d'un objet client ne récupère pas toutes les propriétés