Share via


Wertobjekte können nicht für mehrere Methoden in einer Abfrage verwendet werden

Letzte Änderung: Freitag, 27. Mai 2011

Gilt für: SharePoint Foundation 2010

Verfügbar in SharePoint Online

Wenn Sie eine Methode oder eine Eigenschaft für die Rückgabe eines Werts oder ein Objekt verwenden, das von der ClientValueObject-Klasse (JavaScript: ClientValueObject) erbt, können Sie den Wert nicht als Parameter für einen weiteren Methodenaufruf in derselben Abfrage verwenden. Weitere Informationen zu Wertobjekten finden Sie unter Clientobjekte, Wertobjekte und skalare Eigenschaften.

Angenommen, Sie möchten eine SharePoint-Liste erstellen, deren Anzeigename mit dem Titel der Website identisch ist. Wenn Ihnen das SharePoint Foundation-Serverobjektmodell bekannt ist, sind Sie vielleicht versucht, Code ähnlich dem folgenden zu schreiben.

Falscher Code

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

Wenn Sie den Code kompilieren, wird eine PropertyOrFieldNotInitializedException-Ausnahme zurückgegeben, weil die Eigenschaft oder das Feld nicht initialisiert wurde. In dem Beispiel wird eine Ausnahme zurückgegeben, weil die Title-Eigenschaft (JavaScript: title) des Websiteobjekts vor dem Aufruf von ExecuteQuery() nicht verfügbar ist. Während Sie in SQL die Möglichkeit haben, eine lokale Variable zu deklarieren, die den Websitetitel enthält, und die lokale Variable bei der Listenerstellung zu verwenden, können Sie im Clientobjektmodell keine lokale Variable deklarieren. Daher müssen Sie ExecuteQuery() oder ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) (JavaScript: executeQueryAsync(succeededCallback, failedCallback)) zweimal aufrufen: einmal, um den Wert der Title-Eigenschaft (JavaScript: title) zurückzugeben und das zweite Mal, um die Liste zu erstellen. Dies wird im folgenden überarbeiteten Beispiel veranschaulicht.

Richtiger Code

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

Siehe auch

Konzepte

Übersicht über den Datenabruf

Aufrufen von "Load" und "ExecuteQuery" vor dem Zugriff auf Werteigenschaften

Clientobjekte können für mehrere Methoden in einer Abfrage verwendet werden

Gruppieren des Datenabrufs in demselben Objekt

Beim Abrufen eines Clientobjekts werden nicht alle Eigenschaften abgerufen