Uso del modelo de objetos Silverlight
Última modificación: jueves, 01 de julio de 2010
Hace referencia a: SharePoint Foundation 2010
Disponible en SharePoint Online
Microsoft SharePoint Foundation 2010 admite la implementación del modelo de objetos Silverlight en dos contextos: dentro de un elemento web de Silverlight y dentro del sistema de acceso a datos entre dominios de Silverlight, a través del cual una aplicación de Silverlight interactúa con datos de Microsoft SharePoint Foundation 2010. Una tercera opción (modificar la directiva de acceso de cliente entre dominios en el servidor) genera riesgos de seguridad y no se admite en SharePoint Foundation 2010.
Debido a que la ejecución de consultas es asincrónica cuando usa el modelo de objetos Silverlight de SharePoint Foundation, debe pasar delegados para métodos de devolución de llamada como parámetros en el método ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler), de manera similar a la ejecución de consultas en el modelo de objetos de JavaScript. Sin embargo, para ejecutar código que realiza cambios en la interfaz de usuario (UI) a través del modelo de objetos Silverlight, debe delegar este trabajo al objeto Dispatcher del subproceso que creó la UI mediante la llamada a BeginInvoke(), como se muestra en los siguientes ejemplos.
Implementación de código a través de un elemento web de Silverlight
Para usar el modelo de objetos Silverlight de SharePoint Foundation dentro de un elemento web de Silverlight, puede crear una aplicación de Silverlight en Visual Studio y agregar el código a la clase Page en el archivo predeterminado Page.xaml.cs del proyecto. Después de compilar el proyecto, cargue el paquete de aplicación del proyecto (.xap) en una biblioteca de documentos. Inserte un elemento web de Silverlight en una página de elementos web y apunte el origen de la dirección URL del elemento web al archivo .xap en la biblioteca de documentos.
En los siguientes ejemplos se suponen las definiciones de un control Button y un control TextBlock en el archivo MainPage.xml del proyecto.
Recuperación de datos de lista
En el siguiente ejemplo se muestra cómo recuperar datos de SharePoint Foundation dentro del contexto de una aplicación de Silverlight. El ejemplo implica el uso de controladores de eventos para la ejecución de consultas correcta o incorrecta. El método onQuerySucceeded crea un delegado UpdateUIMethod para mostrar datos de lista devueltos en la interfaz de usuario.
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
En el ejemplo anterior se usa la propiedad Current para especificar el contexto de solicitud actual, en lugar de usar el constructor ClientContext(String) y especificar una dirección URL. Puede cargar, por ejemplo, el archivo .xap en Documentos compartidos en el sitio web raíz de la colección de sitios, y crear una página de elementos web en un sitio web secundario en cualquier lugar dentro del sitio web raíz y agregar a esta página un elemento web de Silverlight que apunte al archivo .xap y, por lo tanto, implemente su lógica. En otras palabras, el código podría hospedarse en el sitio web raíz, pero su lógica estaría disponible para cualquier sitio web de la colección de sitios.
Creación de un elemento de lista
En el siguiente ejemplo se muestra cómo crear un elemento de lista en una lista específica. Se usa un delegado para mostrar información sobre el nuevo elemento en la interfaz de usuario.
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
Vea también
Conceptos
Ejemplo de código: Visor de lista de Silverlight
Introducción a la recuperación de datos
Instrucciones del modelo de objetos cliente
Procedimiento para recuperar listas
Procedimiento para crear, actualizar y eliminar elementos de lista
Tareas comunes de programación