Partager via


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