Partager via


Appeler Load et ExecuteQuery avant d’accéder aux propriétés de valeur

Dernière modification : mardi 9 février 2010

S’applique à : SharePoint Foundation 2010

Disponible dans SharePoint Online

Avant de pouvoir accéder aux propriétés de valeur d’un objet client, vous devez appeler les méthodes Load<T>(T, []) (JavaScript: load(clientObject)) et ExecuteQuery() ou ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) (JavaScript: executeQueryAsync(succeededCallback, failedCallback)) sur l’objet ClientContext (JavaScript: ClientContext).

Si vous connaissez bien le modèle objet serveur Microsoft SharePoint Foundation 2010, vous pouvez être tenté d’écrire du code qui utilise la bibliothèque cliente de la même façon que du code qui emploie la bibliothèque serveur. Si vous souhaitez afficher le titre d’un site Web par exemple, vous pouvez penser qu’il est possible d’écrire du code comme dans l’exemple C# ci-après utilisant la bibliothèque cliente.

Code incorrect

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);
        }
    }
}

La compilation du code renvoie une exception PropertyOrFieldNotInitializedException, car la valeur de la propriété n’a pas été récupérée du serveur. L’exemple renvoie une exception parce que la bibliothèque cliente utilise un modèle de programmation qui ressemble à SQL. Lorsque vous utilisez SQL, vous devez effectuer les opérations suivantes :

  1. créer une requête SQL via une procédure stockée ou une requête SQL ad hoc ;

  2. exécuter la requête SQL ;

  3. lire les résultats SQL.

Le modèle objet client utilise le même modèle que SQL. Lorsque vous appelez une méthode, vous créez une requête avec la bibliothèque cliente. Vous pouvez créer des requêtes et celles-ci peuvent ensuite s’accumuler avant d’être exécutées. Vous ne les avez toutefois pas envoyées au serveur après le premier chargement de l’objet ou de la propriété adéquate via la méthode Load<T>(T, []) (JavaScript: load(clientObject)), puis de l’appel des méthodes ExecuteQuery() ou ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) (JavaScript: executeQueryAsync(succeededCallback, failedCallback)). Pour que le code précédent fonctionne, vous devez apporter les modifications ci-après.

Code correct

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());
}

Pour améliorer les performances, le premier appel de méthode ajouté à l’exemple précédent utilise une expression de requête LINQ pour demander de façon explicite la propriété Title du site Web (JavaScript: title). Le deuxième appel de méthode exécute ensuite la requête. Spécifier le titre du site Web par l’intermédiaire du modèle objet client équivaut donc à la commande SQL SELECT Title FROM Webs. Si vous souhaitez récupérer toutes les propriétés du site Web, vous pouvez utiliser clientContext.Load(oWebsite); qui équivaut à la commande SQL SELECT * FROM Webs.

Voir aussi

Concepts

Vue d'ensemble de la récupération des données

Les objets valeur ne sont pas utilisables entre méthodes dans une requête

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