Freigeben über


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

Letzte Änderung: Dienstag, 9. Februar 2010

Gilt für: SharePoint Foundation 2010

Verfügbar in SharePoint Online

Bevor Sie auf Werteigenschaften eines Clientobjekts zugreifen können, müssen Sie die Load<T>(T, [])-Methode (JavaScript: load(clientObject)) und die Methode ExecuteQuery() oder ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) (JavaScript: executeQueryAsync(succeededCallback, failedCallback)) für das ClientContext-Objekt (JavaScript: ClientContext) aufrufen.

Wenn Sie mit dem Microsoft SharePoint Foundation 2010-Serverobjektmodell vertraut sind, sind Sie möglicherweise versucht, Code für die Verwendung der Clientbibliothek auf die gleiche Weise zu schreiben wie Code für die Verwendung der Serverbibliothek. Wenn Sie beispielsweise den Titel einer Website anzeigen möchten, glauben Sie möglicherweise, dass Sie Code wie im folgenden C#-Beispiel schreiben können, in dem die Clientbibliothek verwendet wird.

Falscher Code

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

Beim Kompilieren des Codes wird PropertyOrFieldNotInitializedException zurückgegeben, da der Wert der Eigenschaft nicht vom Server abgerufen wurde. Im Beispiel wird eine Ausnahme zurückgegeben, da in der Clientbibliothek ein SQL-ähnliches Programmiermuster verwendet wird. Wenn Sie SQL verwenden, müssen Sie folgende Aktionen ausführen:

  1. Erstellen Sie über eine Ad-hoc-SQL-Abfrage oder über eine gespeicherte Prozedur eine SQL-Abfrage.

  2. Führen Sie die SQL-Abfrage aus.

  3. Lesen Sie die Ergebnisse aus SQL.

Im Clientobjektmodell wird das gleiche Muster verwendet wie in SQL. Wenn Sie eine Methode aufrufen, erstellen Sie eine Abfrage für die Clientbibliothek. Sie können Abfragen erstellen, die vor der Ausführung akkumuliert werden können. Die Abfragen werden jedoch erst an den Server gesendet, wenn Sie über die Load<T>(T, [])-Methode (JavaScript: load(clientObject)) das entsprechende Objekt oder die entsprechende Eigenschaft laden und dann die Methode ExecuteQuery() oder ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) (JavaScript: executeQueryAsync(succeededCallback, failedCallback)) aufrufen. Damit der oben gezeigte Code funktionsfähig ist, müssen Sie die folgenden Änderungen vornehmen.

Richtiger Code

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

Zur Verbesserung der Leistung wird im ersten Methodenaufruf, der dem vorherigen Beispiel hinzugefügt wird, ein LINQ-Abfrageausdruck verwendet, in dem explizit nach der Title-Eigenschaft (JavaScript: title) der Website gefragt wird. Im zweiten Methodenaufruf wird dann die Abfrage ausgeführt. Das Angeben des Titels der Website über das Clientobjektmodell ist daher mit der Verwendung des SQL-Befehls SELECT Title FROM Webs vergleichbar. Wenn Sie alle Eigenschaften der Website abrufen möchten, können Sie clientContext.Load(oWebsite); verwenden. Dies ist mit dem SQL-Befehl SELECT * FROM Webs vergleichbar.

Siehe auch

Konzepte

Übersicht über den Datenabruf

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

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