Verwenden des Silverlight-Objektmodells

Letzte Änderung: Donnerstag, 1. Juli 2010

Gilt für: SharePoint Foundation 2010

Verfügbar in SharePoint Online

Microsoft SharePoint Foundation 2010 unterstützt die Implementierung des Silverlight-Clientobjektmodells in zwei Kontexten: in einem Silverlight-Webpart und innerhalb des Silverlight-Systems für domänenübergreifenden Datenzugriff (Cross-Domain Data Access), über das eine Silverlight-Anwendung mit Microsoft SharePoint Foundation 2010-Daten interagiert. Eine dritte Möglichkeit – das Ändern der domänenübergreifenden Richtlinie für den Clientzugriff – bringt Sicherheitsrisiken mit sich und wird in SharePoint Foundation 2010 nicht unterstützt.

Da die Abfrageausführung bei Verwendung des SharePoint Foundation Silverlight-Objektmodells asynchron ist, müssen Sie Delegaten für Rückrufmethoden als Parameter in der ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler)-Methode übergeben, ähnlich wie bei der Abfrageausführung im JavaScript-Objektmodell. Zum Ausführen von Code, der über das Silverlight-Objektmodell Änderungen an der Benutzeroberfläche (User Interface, UI) vornimmt, müssen Sie diese Aufgabe an das Dispatcher-Objekt des Threads delegieren, der die Benutzeroberfläche durch Aufrufen der BeginInvoke()-Methode erstellt hat, wie in den folgenden Beispielen gezeigt.

Bereitstellen von Code über ein Silverlight-Webpart

Wenn Sie das SharePoint Foundation Silverlight-Objektmodell in einem Silverlight-Webpart verwenden möchten, können Sie eine Silverlight-Anwendung in Visual Studio erstellen und der Page-Klasse in der standardmäßigen Page.xaml.cs-Datei Ihres Projekts den Code hinzufügen. Nachdem Sie das Projekt erstellt haben, laden Sie die Anwendungspaketdatei (XAP-Datei) des Projekts in eine Dokumentbibliothek hoch. Fügen Sie ein Silverlight-Webpart in eine Webpartseite ein, und richten Sie die URL-Quelle des Webparts auf die XAP-Datei in der Dokumentbibliothek.

Im folgenden Beispiel wird von den Definitionen eines Button-Steuerelements und eines TextBlock-Steuerelements in der MainPage.xml-Datei des Projekts ausgegangen.

Abrufen von Listendaten

Im folgenden Beispiel wird gezeigt, wie Sie SharePoint Foundation-Daten im Kontext einer Silverlight-Anwendung abrufen können. Dabei werden Ereignishandler für die erfolgreiche Abfrageausführung oder für Fehler bei der Abfrageausführung verwendet. Mit der onQuerySucceeded-Methode wird ein Delegat erstellt, UpdateUIMethod, mit dem die zurückgegebenen Listendaten auf der Benutzeroberfläche angezeigt werden.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.SharePoint.Client;
 
namespace Microsoft.SDK.SharePointServices.Samples
{
    public partial class MainPage : UserControl
    {
        Web oWebsite;
        ListCollection collList;
        IEnumerable<List> listInfo;
 
        public MainPage()
        {
            InitializeComponent();
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            ClientContext clientContext = ClientContext.Current;
            oWebsite = clientContext.Web;
            ListCollection collList = oWebsite.Lists;
 
             clientContext.Load(oWebsite,
                website=>website.Title);
 
             listInfo = clientContext.LoadQuery(
                collList.Include(
                    list=>list.Title,
                    list=>list.Fields.Include(
                        field=>field.Title).Where(
                        field=>field.Required  == true
                        && field.Hidden != true)));
 
            clientContext.ExecuteQueryAsync(onQuerySucceeded, onQueryFailed);
        }
 
        private void onQuerySucceeded(object sender, ClientRequestSucceededEventArgs args)
        {
            UpdateUIMethod updateUI = DisplayInfo;
            this.Dispatcher.BeginInvoke(updateUI);
        }
 
        private void onQueryFailed(object sender, ClientRequestFailedEventArgs args)
        {
            MessageBox.Show = "Request failed. " + args.Message + "\n" + args.StackTrace;
        }
 
        private void DisplayInfo()
        {
            MyOutput.Text = "Title: " + oWebsite.Title;
            collList = oWebsite.Lists;
 
            foreach (List oList in listInfo)
            {
                MyOutput.Text += "\n\tList: " + oList.Title;
 
                FieldCollection collField = oList.Fields;
                foreach (Field oField in collField)
                {
                    MyOutput.Text += "\n\t\tField: " + oField.Title;
                }
            }
        }
 
        private delegate void UpdateUIMethod();
    }
}
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Net
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Documents
Imports System.Windows.Input
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Shapes
Imports Microsoft.SharePoint.Client

Namespace Microsoft.SDK.SharePointServices.Samples
    Partial Public Class MainPage
        Inherits UserControl
        Private oWebsite As Web
        Private collList As ListCollection
        Private listInfo As IEnumerable(Of List)

        Public Sub New()
            InitializeComponent()
        End Sub

        Private Sub Button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            Dim clientContext As ClientContext = ClientContext.Current
            oWebsite = clientContext.Web
            Dim collList As ListCollection = oWebsite.Lists

            clientContext.Load(oWebsite, Function(website) website.Title)

            listInfo = clientContext.LoadQuery(collList.Include(Function(list) list.Title, Function(list) list.Fields.Include(Function(field) field.Title).Where(Function(field) field.Required = True AndAlso field.Hidden <> True)))

            clientContext.ExecuteQueryAsync(AddressOf onQuerySucceeded, AddressOf onQueryFailed)
        End Sub

        Private Sub onQuerySucceeded(ByVal sender As Object, ByVal args As ClientRequestSucceededEventArgs)
            Dim updateUI As UpdateUIMethod = AddressOf DisplayInfo
            Me.Dispatcher.BeginInvoke(updateUI)
        End Sub

        Private Sub onQueryFailed(ByVal sender As Object, ByVal args As ClientRequestFailedEventArgs)
            MessageBox.Show = "Request failed. " & args.Message & vbLf & args.StackTrace
        End Sub

        Private Sub DisplayInfo()
            MyOutput.Text = "Title: " & oWebsite.Title
            collList = oWebsite.Lists

            For Each oList As List In listInfo
                MyOutput.Text += vbLf & vbTab & "List: " & oList.Title

                Dim collField As FieldCollection = oList.Fields
                For Each oField As Field In collField
                    MyOutput.Text += vbLf & vbTab & vbTab & "Field: " & oField.Title
                Next oField
            Next oList
        End Sub

        Private Delegate Sub UpdateUIMethod()
    End Class
End Namespace

Im vorherigen Beispiel wird der aktuelle Anforderungskontext mithilfe der Current-Eigenschaft angegeben und nicht mithilfe des ClientContext(String)-Konstruktors und durch Angeben einer URL. Sie können z. B. die XAP-Datei in das Verzeichnis Freigegebene Dokumente auf der Stammwebsite der Websitesammlung hochladen, eine Webpartseite auf einer untergeordneten Website an einer beliebigen Stelle unterhalb der Stammwebsite erstellen und dieser Seite ein Silverlight-Webpart hinzufügen, das auf die XAP-Datei zeigt und somit deren Logik implementiert. Anders ausgedrückt: Der Code befindet sich auf der Stammwebsite, die zugehörige Logik wird jedoch jeder Website in der Websitesammlung zur Verfügung gestellt.

Erstellen eines Listenelements

Im folgenden Beispiel wird gezeigt, wie Sie ein Listenelement in einer bestimmten Liste erstellen können. Dabei wird ein Delegat verwendet, um Informationen über das neue Element auf der Benutzeroberfläche anzuzeigen.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.SharePoint.Client;

namespace Microsoft.SDK.SharePointServices.Samples
{
    public partial class MainPage : UserControl
    {
        private List oList;
        private string siteUrl = "http://MyServer/sites/MySiteCollection/MyWebSite";

        public MainPage()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            ClientContext clientContext = new ClientContext(siteUrl);
            Web oWebsite = clientContext.Web;
            ListCollection collList = oWebsite.Lists;

            oList = clientContext.Web.Lists.GetByTitle("Announcements");

            ListItem oListItem = oList.AddItem(new ListItemCreationInformation());
            oListItem["Title"] = "My new item";
            oListItem["Body"] = "This is my new Silverlight item.";
            oListItem.Update();

            clientContext.Load(oList,
                list => list.Title);

            clientContext.ExecuteQueryAsync(onQuerySucceeded, onQueryFailed);
        }

        private void onQuerySucceeded(object sender, ClientRequestSucceededEventArgs args)
        {
            UpdateUIMethod updateUI = DisplayInfo;
            this.Dispatcher.BeginInvoke(updateUI);
        }

        private void DisplayInfo()
        {
            MyOutput.Text = "New item created in " + oList.Title;
        }

        private delegate void UpdateUIMethod(); 
        
        private void onQueryFailed(object sender, ClientRequestFailedEventArgs args)
        {
            MessageBox.Show("Request failed. " + args.Message + "\n" + args.StackTrace);
        }
    }
}
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Net
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Documents
Imports System.Windows.Input
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Shapes
Imports Microsoft.SharePoint.Client

Namespace Microsoft.SDK.SharePointServices.Samples
    Partial Public Class MainPage
        Inherits UserControl
        Private oList As List
        Private siteUrl As String = "http://MyServer/sites/MySiteCollection/MyWebSite"

        Public Sub New()
            InitializeComponent()
        End Sub

        Private Sub Button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            Dim clientContext As New ClientContext(siteUrl)
            Dim oWebsite As Web = clientContext.Web
            Dim collList As ListCollection = oWebsite.Lists

            oList = clientContext.Web.Lists.GetByTitle("Announcements")

            Dim oListItem As ListItem = oList.AddItem(New ListItemCreationInformation())
            oListItem("Title") = "My new item"
            oListItem("Body") = "This is my new Silverlight item."
            oListItem.Update()

            clientContext.Load(oList, Function(list) list.Title)

            clientContext.ExecuteQueryAsync(AddressOf onQuerySucceeded, AddressOf onQueryFailed)
        End Sub

        Private Sub onQuerySucceeded(ByVal sender As Object, ByVal args As ClientRequestSucceededEventArgs)
            Dim updateUI As UpdateUIMethod = AddressOf DisplayInfo
            Me.Dispatcher.BeginInvoke(updateUI)
        End Sub

        Private Sub DisplayInfo()
            MyOutput.Text = "New item created in " & oList.Title
        End Sub

        Private Delegate Sub UpdateUIMethod()

        Private Sub onQueryFailed(ByVal sender As Object, ByVal args As ClientRequestFailedEventArgs)
            MessageBox.Show("Request failed. " & args.Message & vbLf & args.StackTrace)
        End Sub
    End Class
End Namespace

Siehe auch

Konzepte

Codebeispiel: Silverlight List Viewer

Übersicht über den Datenabruf

Richtlinien für das Clientobjektmodell

Gewusst wie: Abrufen von Listen

Gewusst wie: Erstellen, Aktualisieren und Löschen von Listenelementen

Allgemeine Programmieraufgaben

Weitere Ressourcen

Clientklassenbibliothek

ECMAScript-Klassenbibliothek