Implementing the Client-Side Object Model
Applies to: SharePoint Foundation 2010
The previous part in this walkthrough, Implementing the SharePoint Foundation REST Interface, shows how to use the ADO.NET Data Services and the SharePoint Foundation REST interface to work with data that is stored in lists and libraries. However, the REST interface does not provide access to other data in SharePoint Foundation sites, as may be required in more advanced applications. In previous versions of SharePoint Foundation, you might have used the default web services to access data, and then defined wrapper classes and converted the returned SOAP XML into objects for your application. Microsoft SharePoint Foundation 2010 introduces a managed client-side object model that provides access to a broader set of SharePoint Foundation objects than the new REST interface, at website level or lower within the hierarchy of objects, and which makes it easier to work with data in a remote application than it is to use the web services.
This example assumes that you created the Windows Forms Application that is described in Implementing the SharePoint Foundation REST Interface. The example uses the client object model to set the text in the form's title bar to the website's title, and to change the description of the Projects list on the site based on the project item that is selected when the user clicks a Star Project button in the form.
Using the Client Object Model to Change the Form Title and List Description
Add a reference to two client object model assemblies, Microsoft.SharePoint.Client.dll and Microsoft.SharePoint.Client.Runtime.dll. Right-click References in Solution Explorer, and then click Add Reference. On the .NET tab of the Add Reference dialog box, select Microsoft.SharePoint.Client and Microsoft.SharePoint.Client.Runtime, and then click OK.
In Form1.cs or Form1.vb, add statements to import the Microsoft.SharePoint.Client namespace into the project. Use the client context to gain entry to the client object model, using a ClientContext() constructor to connect to the website, as follows.
Imports ProjectTracker.ServiceReference1 Imports System.Net Imports Microsoft.SharePoint.Client Public Class Form1 Private Shared websiteUrl As String = "http://YourServer/sites/YourSiteCollection/YourWebSite" Private context As New TestWebsDataContext( New Uri(websiteUrl + "/_vti_bin/listdata.svc")) Private clientContext As New ClientContext(websiteUrl) Public Sub New() InitializeComponent() End Sub
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Microsoft.SharePoint.Client; namespace ProjectTracker { using ServiceReference1; using System.Net; public partial class Form1 : Form { private static string websiteUrl= "http://YourServer/sites/YourSiteCollection/YourWebSite"; TestWebsDataContext context = new TestWebsDataContext( new Uri(websiteUrl + "/_vti_bin/listdata.svc")); ClientContext clientContext = new ClientContext(websiteUrl); public Form1() { InitializeComponent(); }
Use the Form1_Load event to send the request to the SharePoint Foundation server. The client object model automatically uses the default credentials. To use an object, you must call the Load<T>(T, []) method to explicitly request loading the object’s properties, and then call the ExecuteQuery() method (or in the Microsoft Silverlight version of the object model, the ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) method), to send the request to SharePoint Foundation and populate the website object with data. In the following snippet, the title bar of the form is set to the title of the website.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load context.Credentials = CredentialCache.DefaultCredentials ProjectsBindingSource.DataSource = context.Projects clientContext.Load(clientContext.Web) clientContext.ExecuteQuery() Me.Text = clientContext.Web.Title End Sub Private Sub ProjectsBindingSource_CurrentChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ProjectsBindingSource.CurrentChanged EmployeesBindingSource.DataSource = From emp In context.Employees _ Where emp.Project.Id = DirectCast(ProjectsBindingSource.Current, ProjectsItem).Id _ Select emp End Sub Private Sub ProjectsBindingSource_CurrentItemChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ProjectsBindingSource.CurrentItemChanged context.UpdateObject(ProjectsBindingSource.Current) End Sub Private Sub ProjectsBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ProjectsBindingNavigatorSaveItem.Click context.SaveChanges() End Sub
private void Form1_Load(object sender, EventArgs e) { context.Credentials = CredentialCache.DefaultCredentials; projectsBindingSource.DataSource = context.Projects; clientContext.Load(clientContext.Web); clientContext.ExecuteQuery(); this.Text = clientContext.Web.Title; } private void projectsBindingSource_CurrentChanged(object sender, EventArgs e) { employeesBindingSource.DataSource = from emp in context.Employees where emp.Project.Id == ((ProjectsItem)projectsBindingSource.Current).Id select emp; } private void projectsBindingNavigatorSaveItem_Click(object sender, EventArgs e) { context.SaveChanges(); } private void projectsBindingSource_CurrentItemChanged(object sender, EventArgs e) { context.UpdateObject(projectsBindingSource.Current); }
In addition to changing the title of the form, this example also changes the description of the Projects list that is displayed in the website based on user selection. When the user selects an item in the Projects list and clicks a button, the description of the list changes to highlight the selected project. To add a button to Form1, right-click the form title bar next to the Save button, and then select Button in the drop-down list that appears.
In the Properties window for the button, set DisplayStyle to Text, and type Star Project as the value for the Text setting.
Double-click the button in the form to open its Click event, and add the following code, which uses the GetByTitle(String) method of the client object model to return the list and access its description. The example uses the ADO.NET Data Services Projects data source to get the title of the currently selected project, and casts the selected item as a ProjectsItem object to access the Title property of the item.
Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click Dim oList As List = clientContext.Web.Lists.GetByTitle("Projects") oList.Description = String.Format("Star Project of the Week is {0}!!!", DirectCast(ProjectsBindingSource.Current, ProjectsItem).Title) oList.Update() clientContext.ExecuteQuery() End Sub End Class
private void toolStripButton1_Click(object sender, EventArgs e) { List oList = clientContext.Web.Lists.GetByTitle("Projects"); oList.Description = string.Format("Star Project of the Week is {0}!!!", ((ProjectsItem)projectsBindingSource.Current).Title); oList.Update(); clientContext.ExecuteQuery(); } }}
Press F5 to run the application to see that the form’s title has changed. Select one of the items in the Projects DataGridView control, and then click Star Project to change the list’s description.
For the complete Form1 code sample, see Complete SharePoint Foundation WCF Form1 Sample.
See Also
Concepts
Walkthrough: Creating and Implementing a Custom WCF Service in SharePoint Foundation
How to: Create, Update, and Delete Lists