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:
Erstellen Sie über eine Ad-hoc-SQL-Abfrage oder über eine gespeicherte Prozedur eine SQL-Abfrage.
Führen Sie die SQL-Abfrage aus.
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
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