SharePoint Online -用SharePoint Online进行基于云的协作

[原文发表地址] SharePoint Online – Cloud-Based Collaboration with SharePoint Online

随着Office 365的发行,微软将提供下一代微软在线服务一项基于SharePoint 2010, Exchange 2010 Lync Server 2010,并基于云的协作和通信服务。Office 365目前正处于测试阶段。在微软管理的云数据中心中,它会提供基于订阅的SharePoint, ExchangeLync的软件软件即服务(Saas)。

SharePoint Online作为SharePoint 2010的云版本,将为用户提供许多与SharePoint 2010相同的功能,而用户无需管理可扩展性和安全协作解决方案所需的硬件和软件。在本文中,我会通过构建在SharePoint Online中运行的解决方案,来概括SharePoint Online开发与SharePoint 2010开发的异同点。

随着SharePoint Online下一版本的发布,SharePoint开发人员将能够使用他们在SharePoint 2010里使用的相同技能和工具来开发协作方案,这些工具和技能包括 Visual Studio 2010, SharePoint Designer 2010, C#Visual Basic以及SharePoint API SDK。在开发内部部署的SharePoint和开发云端的SharePoint有很多共同点,但是同样也有很多显著的差异会影响你如何构建解决方案。

了解这些差异将有助于您了解哪些解决方案可以在SharePoint Online里创建并运行,以及如何开发这些解决方案。

自定义SharePoint Online的相似点

SharePoint 2010的开发中,您可以通过使用浏览器和SharePoint Designer 2010来自定义SharePoint,并通过使用Visual Studio 2010生成解决方案。而对于SharePoint Online来说,通过浏览器和SharePoint Designer 2010来进行自定义与SharePoint 2010版本大致相同(鉴于下一节所述的功能差异)。使用Visual Studio 2010开发SharePoint Online解决方案也大体相同。通过其中迭代开发的集成调试体验,在Visual Studio 2010中的开发基于SharePoint 2010的本地实例,(无论运行在Windows 7Windows Server 2008 R2的本地机或虚拟机(VM)中)。开发完成后,该解决方案通过SharePoint 2010同样提供的解决方案库,被上传到SharePoint Online中。

自定义SharePoint Online的关键差异

尽管SharePoint Online建立在SharePoint 2010的基础上,但当您在开发SharePoint Online的解决方案时,仍有一些关键差异需要您牢记。首先,SharePoint Online只支持网站和Web范围的解决方案。它运行在多租户云中,多租约运行在一个共享的数据库基础架构中,所以Farm范围(功能在这整个Farm范围内被激活)的解决方案不被支持也并不奇怪。同样,在SharePoint Online中,您的SharePoint租赁最高访问级别为网站集级别,所以Web应用范围的功能(功能在一个Web应用中的每个Web站点中运行)也不被支持

其次,SharePoint Online只支持部分信任的解决方案。完全信任的解决方案,也就是那些访问权限超出网站级别,或者可以授权以管理员级别运行Farm上的解决方案也不受支持

最后,尽管SharePoint Online是建立在SharePoint 2010的基础上,但它和内部服务器部署的2010版在功能上并没有百分百的相同。如欲了解SharePoint 2010SharePoint Online的完整功能比较,请参阅微软SharePoint Online测试版服务说明,您可从bit.ly/bBckolOffice 365测试版服务说明中获取有关信息

功能列表显示大多数的SharePoint自定义功能都受支持。不支持业务连接服务(BCS,外部列表和从SharePoint
Online
外部调用Web服务(不在部分信任的解决方案中被支持)将会对构建运行在SharePoint Online的解决方案造成巨大影响。不过,我们有计划在将来发布的版本中支持BCS服务。

了解了这些异同点后,让我们看看一些解决方案的示例。您可以在SharePoint
Online
中生成这些类型的解决方案并运行,这包括了沙盒解决方案和SharePoint客户端对象模型(OM)。其他类型的解决方案,例如通过声明式工作流解决方案将业务流程自动化等,将在以后的文章中介绍。

用沙盒解决方案开发SharePoint Online

在上节中,您了解到SharePoint
Online解决方案必须限于站点或Web范围的功能,数据访问限定于站点范围的集合,且必须在部分信任环境中运行。开发以沙盒模式运行的解决方案符合所有这些条件,同时让SharePoint
Online管理员可以直接将解决方案上传到解决方案库,从而实现轻松部署。

Visual Studio 2010为沙盒解决方案提供了极大支持,其中包括项目模板和项目项模板支持,创建新项目为沙盒解决方案的SharePoint自定义向导,站点集范围的SharePointAPIIntelliSense支持,以及调试和打包支持。若要开始构建SharePoin Online解决方案,你需要开发并调试作用在本地SharePoint 2010的解决方案。你需要在安装SharePoint
2010Visual Studio 2010的同时,安装64位的Windows 7Windows Server 2008 R2 。另一个着手构建解决方案的好办法是使用Information Worker Demonstration and Evaluation Virtual Machine
RTM)。它提供了虚拟化的SharePoint
2010开发环境(从
bit.ly/ezfe2Y 下载)。我也推荐Visual Studio SharePoint 2010 Power Toolsbit.ly/azq882) ,它增加了沙盒和沙盒模式的可视Web部件项目项模板的编译时支持。

在本文的示例中,我将运用下面的这个简单场景来构建解决方案:即为虚拟的Contoso公司员工提供他们采购系统所不支持的采购申请功能。首先,我会在内部部署的SharePoint 2010开发环境中创建一个站点集和站点。我使用的是前面提到过的虚拟机,因此我创建了http://o365dpe.contoso.com/sites/spomsdnmag/purchasing。我的第一个解决方案会部署一个用来追踪这些非标准化购买的列表。我会打开Visual Studio 2010,选择文件|新项目,并在新建项目对话框中选择“空白的SharePoint项目”,然后将该项目命名为 PurchasingMgr

SharePoint自定义向导对话框中,我将在“what local site… (您想使用哪个地方站点进行调试) 一项中键入我站点的URLhttp://o365dpe.contoso.com/sites/spomsdnmag/Purchasing/,选择“部署为沙盒解决方案”,然后点击“完成”,如图一所示。

1 制定PurchasingMgr的站点和信任级别

接下来,我会在解决方案资源管理器中选择PurchasingMgr项目,右击并选择“添加新项目”。在“添加新项目”
对话框中,我会在已安装的模板节点中选择
SharePoint 2010支持的SharePoint项模板。不是所有这些模板都支持沙盒解决方案,所以那些模板在SharePoint Online中也并非都被支持。图2显示了支持沙盒解决方案的项目模板。

2 在沙盒解决方案中支持的项目模板

项模板

是否兼容沙盒?

备注

可视Web 部件

需要在SharePoint 服务器上安装ASCX 文件

可视Web 部件 (沙盒模式)

通过安装 Visual Studio 2010 SharePoint Power Tools提供此项功能

Web 部件

顺序工作流

要求将工作流解决方案部署为Farm解决方案

状态机工作流

要求将工作流解决方案部署为Farm解决方案

业务数据连接模型

需要将BCS解决方案部署为完全信任的解决方案 ;这是在 SharePoint Online 中不支持的功能

应用程序页

需要将 ASPX 页面部署到
SharePoint 服务器

事件接收器

模块

内容类型

通过内容类型添加的列表定义

列表定义

列表实例

空元素

用户控件

需要在 SharePoint 服务器上安装的 ASCX 文件

为了生成我的列表,我将选择内容类型项模板来定义站点列和内容类型,并键入NonStandBusPurchaseRequestsCT作为名字。

SharePoint
自定义向导中,我会选择“项”作为基础内容类型,然后单击“完成”。内容类型将包含一个标题列,一个描述列和一个价格列。我会通过替换用XML创建的Elements.xml中的内容(图3种)来声明定义这些内容类型。

3
通过Elements.xml
定义NonStandBusPurchaseRequestsCT

<?xml
version=”1.0″ encoding=”utf-8″?>

<Elements xmlns=”http://schemas.microsoft.com/sharepoint/”>

<Field SourceID=”http://schemas.microsoft.com/sharepoint/v3″

ID=”{A74E67E5-8905-4280-90C9-DEBFFC30D43D}”

Name=”RequestDescription”

DisplayName=”Description”

Group=”Purchasing Manager Custom Columns”

Type=”Note”

DisplaceOnUpgrade=”TRUE” />

<Field SourceID=”http://schemas.microsoft.com/sharepoint/v3″

ID=”{CB5054F5-0C60-4DBE-94D2-CEFBFB793C7F}”

Name=”Price”

DisplayName=”Price”

Group=”Purchasing Manager Custom Columns”

Type=”Currency”

DisplaceOnUpgrade=”TRUE” />

<!– Parent
ContentType: Item (0x01) –>

<ContentType ID=”0x010078a81c8413f54917856495e56e7c09ed”

Name=”Purchasing Manager – Non-Standard Business Purchase
Requests Content Type”

Group=”Purchasing Manager Content Types”

Description=

“Non-Standard
Business Purchase Requests Content Type

for the
Purchasing Manager Solution”

Inherits=”TRUE”

Version=”0″>

<FieldRefs>

<FieldRef ID=”{fa564e0f-0c70-4ab9-b863-0177e6ddd247}” Name=”Title”

DisplayName=”Title” />

<FieldRef ID=”{A74E67E5-8905-4280-90C9-DEBFFC30D43D}”

Name=”RequestDescription”

Required=”TRUE” />

<FieldRef ID=”{CB5054F5-0C60-4DBE-94D2-CEFBFB793C7F}” Name=”Price”

Required=”TRUE” />

</FieldRefs>

</ContentType>

</Elements>

接下来,我将在解决方案资源器中右击PurchasingMgr并选择“添加新项目”,来定义基于该内容类型的列表。我将选择项模板“通过内容类型添加的列表定义”,并命名列表定义为NonStandBusPurchaseRequestsListDefn,然后单击“添加”。

SharePoint 自定义向导中,我会选择之前 创建的内容类型,并选中“添加列表实例”。为NonStandBusPurchaseRequestsListDefn创建的Elements.xml如图4所示。

4 通过Elements.xml 定义NonStandBusPurchaseRequestsListDefn

<?xml
version=”1.0″ encoding=”utf-8″?>

<Elements xmlns=”http://schemas.microsoft.com/sharepoint/”>

<!– Do not change
the value of the Name attribute below.

If it does not
match the folder name of the List Definition project item,

an error will
occur when the project is run. –>

<ListTemplate

Name=”NonStandBusPurchaseRequestsListDefn”

Type=”10051″

BaseType=”0″

OnQuickLaunch=”TRUE”

SecurityBits=”11″

Sequence=”410″

DisplayName=”Purchasing Manager –

Non-Standard
Business Purchase Requests List Definition”

Description=

“Non-Standard
Business Purchase Requests List Definition

for the
Purchasing Manager Solution”

Image=”/_layouts/images/itgen.png”/>

</Elements>

请注意,在我创建的功能里的每个列表定义都需要通过一个大于10000的唯一类型值来辨别(以避免与定义在SharePoint中的列表冲突),而且我使用这个值来定义基于那个列表定义的任何列表实例。

要将自定义列表添加到列表视图中,我将打开创建的Schema.xml,并将FiledRef元素添加到默认视图中,如5所示

5 添加自定义列表到NonStandBusPurchaseRequestsListDefn默认视图中

<View BaseViewID=”1″ Type=”HTML” WebPartZoneID=”Main”

DisplayName=”$Resources:core,objectiv_schema_mwsidcamlidC24;”

DefaultView=”TRUE” MobileView=”TRUE”
MobileDefaultView
=”TRUE”

SetupPath=”pages\viewpage.aspx” ImageUrl=”/_layouts/images/generic.png”

Url=”AllItems.aspx”>

<Toolbar Type=”Standard”
/>

<XslLink Default=”TRUE”>main.xsl</XslLink>

<RowLimit Paged=”TRUE”>30</RowLimit>

<ViewFields>

<FieldRef Name=”Attachments”>

</FieldRef>

<FieldRef Name=”LinkTitle”>

</FieldRef>

<FieldRef ID=”{A74E67E5-8905-4280-90C9-DEBFFC30D43D}”

Name=”RequestDescription” />

<FieldRef ID=”{CB5054F5-0C60-4DBE-94D2-CEFBFB793C7F}” Name=”Price”
/>

</ViewFields>

<Query>

<OrderBy>

<FieldRef Name=”ID”>

</FieldRef>

</OrderBy>

</Query>

<ParameterBindings>

<ParameterBinding Name=”NoAnnouncements”

Location=”Resource(wss,noXinviewofY_LIST)” />

<ParameterBinding Name=”NoAnnouncementsHowTo”

Location=”Resource(wss,noXinviewofY_DEFAULT)” />

</ParameterBindings>

</View>

最后,我将定义列表中的一个实例。我选择位于NonStandBusPurchaseRequestsListDefn下的ListInstance1并命名其为NonStandBusPurchaseRequestsListInstance。我会打开Elements.xml,通过添加以下XML来使列表基于内容类型,并为用户提供帮助性说明:

<?xml
version=”1.0″ encoding=”utf-8″?>

<Elements xmlns=”http://schemas.microsoft.com/sharepoint/”>

<ListInstance Title=”Non-Standard
Business Purchase Requests”

OnQuickLaunch=”TRUE”

TemplateType=”10051″

Url=”Lists/NonStandBusPurchaseRequestsListInstance”

Description=

“Non-Standard
Business Purchase Requests List

for the
Purchasing Manager Solution”>

</ListInstance>

</Elements>

Visual Studio 2010中,我会选择“调试”,然后开始调试来测试解决方案。此解决方案被打包并部署到内部部署的网站,如图6所示。

6 调试PurchasingMgr 解决方案

我已经测试了PurchasingMgr方案,我现在可以将其部署到SharePoint Online上了。我将使用工作组站点模板在SharePoint Online上创建一个新的站点集,将其命名为Purchasing。回到Visual Studio 2010中,我会在项目资源管理器中右击PurchasingMgr项目并选择“打包”来打包解决方案。要将解决方案部署到SharePoint
Online,我只需要将其上传到解决方案库并激活站点功能(我需要站点集管理员权限来实现此操作)。要做到这一点,我要登陆SharePoint Online,定位到我的站点集,选择“站点操作
|站点设置”,再选择“解决方案”来访问解决方案库。在解决方案库中,我将单击“解决方案”选项卡,在功能区选择“上传解决方案”,然后在bin/Debug中浏览PurchasingMgr.wsp文件并单击OK,然后激活。你会看到您的解决方案在解决方案库中,如7所示。

7 PurchasingMgr部署到SharePoint Online

接下来,为了激活包含我的网站列,内容类型和列表的功能,我会定位到Purchasing站点并选择站点操作|站点设置|管理站点功能。我会选择Purchasing
Manager(采购经理)内容类型和列表功能,并选择激活。此时您应该会在SharePoint
Online站点看见非标准业务采购请求列表。

Purchasing Manager(采购经理)只是您在SharePoint
Online中利用沙盒解决方案可以完成的其中一个例子。牢记沙盒解决方案的限制,以及SharePoint
Online所支持的功能的限制,你就可以创建能在SharePoint
2010SharePoint Online运行的解决方案。

Silverlight创建客户端解决方案

SharePoint 2010引入了客户端OM。。它为使用运行在远程机器(包括Silverlight
ECMAScript的浏览器)的Microsoft
.NET Framework Silverlight
ECMAScript(包括JavaScript JScript)来构建的SharePoint客户端提供了面向对象和面向客户端的API。该APIMicrosoft.SharePoint服务器端的命名空间是保持一致的,因此学习起来很容易。该API在受支持的客户端类型中也是保持一致的,因此将知识应用于不同的客户端解决方案中也很容易。客户端OM
APISharePoint Online支持。对于云开发,它也是一个很有价值的工具。

比如,我可以使用客户端OM创建一个Silverlight 4应用程序,将项目添加至我的列表中,并托管此应用程序在沙盒Web部件中。为此,我将打开Visual
Studio 2010,选择文件
|新项目,并在新项目对话框中选择“清空SharePoint项目”。我将项目命名为PurchasingMgrWP并单击OK。我会再次创建此解决方案为沙盒解决方案并使其指向我内部部署的Purchasing站点中。为了创建Silverlight
4应用程序,我会右击PurchasingMgrWP解决方案,在已安装模板下选择Silverlight,选择Silverlight应用程序并将解决方案命名为NonStandBusPurchaseReqsSLOM。在新的Silverlight应用程序对话框中,我会取消“在新Web站点中托管Silverlight应用程序”对话框(我们将通过在SharePoint中托管应用程序来进行测试)并选择Silverlight版本为Silverlight 4

若要引用Silverlight客户端OM API ,我会将Microsoft.SharePoint.Client.Silverlight.dllMicrosoft.SharePoint.Client.Silverlight.Runtime.dll的引用添加到项目中。这两个程序集位于C:\Program
Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\ClientBin中。接下来,我将打开MainPage.xaml来创建Silverlight UI,并用8的代码替换XAML

8 NonStandBusPurchaseReqsSLOM MainPage.xaml

<UserControl xmlns:sdk=”http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk”

x:Class=”NonStandBusPurchaseReqsSLOM.MainPage”

xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”

xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”

xmlns:d=”http://schemas.microsoft.com/expression/blend/2008″

xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006″

mc:Ignorable=”d”

d:DesignHeight=”300″ d:DesignWidth=”400″>

<Grid x:Name=”LayoutRoot” Background=”White”>

<Grid.ColumnDefinitions>

<ColumnDefinition />

<ColumnDefinition />

</Grid.ColumnDefinitions>

<Grid.RowDefinitions>

<RowDefinition Height=”Auto”/>

<RowDefinition Height=”Auto”/>

<RowDefinition Height=”Auto”/>

<RowDefinition Height=”Auto”/>

</Grid.RowDefinitions>

<sdk:Label Content=”Title:” Grid.Column=”0″ Grid.Row=”0″ Margin=”3″/>

<sdk:Label Content=”Description:” Grid.Column=”0″ Grid.Row=”1″ Margin=”3″/>

<sdk:Label Content=”Price:” Grid.Column=”0″ Grid.Row=”2″ Margin=”3″/>

<TextBox Name=”Title” Grid.Column=”1″ Grid.Row=”0″ Margin=”3″/>

<TextBox Name=”Description” Grid.Column=”1″ Grid.Row=”1″ Margin=”3″/>

<TextBox Name=”Price” Grid.Column=”1″ Grid.Row=”2″ Margin=”3″/>

<Button Content=”Add” Grid.Column=”1″ Grid.Row=”3″ Margin=”3″

Name=”addNonStanPurchaseReq” HorizontalAlignment=”Right”

Height=”25″ Width=”100″ Click=”addNonStanPurchaseReq_Click” />

</Grid>

</UserControl>

8中的XAML定义文本框和一个按钮来收集信息以添加到我的列表,如9所示

9 设计器中的 MainPage.xaml

双击设计器中的按钮,将类替换成10中的代码。

10 addNonStanPurchaseReq_Click

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 NonStandBusPurchaseReqsSLOM

{

public
partial class MainPage : UserControl

{

private
string webUrl;

public
MainPage(string url)

{

webUrl = url;

InitializeComponent();

}

private
void addNonStanPurchaseReq_Click(object sender, RoutedEventArgs
e)

{

ClientContext
clientContext = new ClientContext(webUrl);

Web webSite =
clientContext.Web;

ListCollection
webLists = webSite.Lists;

List nonStandBusPurList =


clientContext.Web.Lists.GetByTitle(

“Non-Standard Business Purchase Requests”);

ListItem newListItem =


nonStandBusPurList.AddItem(new
ListItemCreationInformation());

newListItem[“Title”] = Title.Text;

newListItem[“RequestDescription”] =
Description.Text;

newListItem[“Price”] = Price.Text;

newListItem.Update();


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


clientContext.ExecuteQueryAsync(onQuerySucceeded, onQueryFailed);

}

private
void onQuerySucceeded(

object
sender, ClientRequestSucceededEventArgs args)

{


Dispatcher.BeginInvoke(() =>

{

MessageBox.Show(“New
item added.”
);

});

}

private
void onQueryFailed(object
sender,


ClientRequestFailedEventArgs args)

{


Dispatcher.BeginInvoke(() =>

{

MessageBox.Show(“Request
failed. “
+ args.Message + “\n”
+

args.StackTrace);

});

}

}

}

10中的代码遵循了客户端OM代码的通用模式。首先,我将通过ClientContext类(相当于SPCContext类)访问客户端上下文。接下来,我将分别通过WebListCollectionList类分别访问站点和列表。请注意SPWeb,
SPListCollection SPList类之间的相似点。最后,我将通过调用List.AddItem方法创建一个ListItem,将用户界面中的数据填充进去并调用ListItem.Update方法。只有当调用ClientContext.Load
ClientContext.ExecuteQueryAsync方法来执行查询时,ListItem才真正被创建。请注意您可以通过ClientContext.Load并调用ClientContext.ExecuteQueryAsync方法加载多个查询,从而节省了到服务器之间的往返。

为了部署Silverlight 4应用程序,我会添加一个板块来和我的Web Part

项目一起部署应用程序。我会在解决方案资源管理器中选择PurchasingMgrWP,右击并选择添加新项目|模块,将模块命名为ClientBin。我将使用以下XML来替换新创建的Elements.xml中的内容:

<?xml version=“1.0” encoding=“utf-8”?>

<Elements xmlns=“http://schemas.microsoft.com/sharepoint/”>

<Module Name=“ClientBin”>

<File Path=“ClientBin\NonStandBusPurchaseReqsSLOM.xap”

Url=“ClientBin/NonStandBusPurchaseReqsSLOM.xap”
/>

</Module>

</Elements>

XMLNonStandBusPurchaseReqsSLOM.xap 文件部署到SharePoint 站点的ClientBin文件夹中。

为使用ClientBin模块部署NonStandBusPurchaseReqsSLOM项目的输出内容,我将在解决方案资源管理器中选择ClientBin模块,并打开“项目输出引用”属性对话框。我将单击“增加”,选择NonStandBusPurchaseReqsSLOM作为项目名称,并选择ElementFile作为部署类型。

接下来,我会将自定义Web部件添加到我的SharePoint解决方案中,来承载我的Silverlight
4应用程序。我会在解决方案资源管理器中选择PurchasingMgrWP,右击并选择添加|新项目,选择Web部件并将其命名为NonStandBusPurchaseReqsWP。为了将参数传递给我的Silverlight
4应用程序(例如一个用来创建ClientContext的站点的URL),我将使用一个自定义Web部件。为此,我会添加一个名为SilverlightObjectTagControl.cs的帮助类,并用11的代码替换类的代码体。

11 添加SilverlightObjectTagControl.cs帮助类

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace PurchasingMgrWP

{

class
SilverlightObjectTagControl : WebControl

{

public
string Source { get;
set; }

public
string InitParameters { get; set; }

protected
override void
CreateChildControls()

{

base.CreateChildControls();

if
(Source != null && Source != “”)

{

string
width = (this.Width == Unit.Empty) ? “400” :

this.Width.ToString();

string
height = (this.Height == Unit.Empty) ? “300” :

this.Height.ToString();

this.Controls.Add(new LiteralControl(


<div>”
+


<object data=\”data:application/x-silverlight-2,\” +


type=\”application/x-silverlight-2\” width=\””
+
width +


\” height=\”” +
height + “\”>” +


<param name=\”source\” value=\””
+ Source + “\”/>” +


<param name=\”onerror\” value=\”onSilverlightError\”
/>”
+


<param name=\”background\” value=\”white\” />”

+


<param name=\”minRuntimeVersion\” value=\”4.0.50826.0\”
/>”
+


<param name=\”autoUpgrade\” value=\”true\” />”

+


<param name=\”initparams\” value=\””
+
InitParameters + “\” />” +


<a href=\”http://go.microsoft.com/fwlink/?LinkID=”
+


149156&v=4.0.50826.0\” +


style=\”text-decoration: none;\”>”
+


<img src=\”http://go.microsoft.com/fwlink/?LinkId=161376\” +


alt=\”Get Microsoft Silverlight\” style=\”border-style:
none\”/>”
+


</a>”
+


</object>”
+


<iframe id=\”_sl_historyFrame\” +


style=.visibility:hidden;height:0;width:0;border:0px.></iframe>”

+


</div>”

));

}

}

}

}

11中的SilverlightObjectTagControl有两个属性:Source用来向Web部件传递Silverlight应用程序的URL,从而可以在Web部件中加载该Silverlight应用程序;InitParameter用来将初始参数传递到Silverlight
4应用程序中。在CreateChildControls方法中,这些属性被用于为Silverlight应用程序生成<object
/>标签。若要使用这个类,打开NonStandBusPurchaseReqsWP.cs,并将该类中的代码替换成12的代码。

12 NonStandBusPurchaseReqsWP.cs

using System;

using System.ComponentModel;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using
System.Web.UI.WebControls.WebParts;

using Microsoft.SharePoint;

using Microsoft.SharePoint.WebControls;

namespace
PurchasingMgrWP.NonStandBusPurchaseReqsWP

{

[ToolboxItemAttribute(false)]

public
class NonStandBusPurchaseReqsWP
: WebPart

{

protected
override void
CreateChildControls()

{

base.CreateChildControls();


SilverlightObjectTagControl slhc =

new SilverlightObjectTagControl();

slhc.Source =
SPContext.Current.Site.Url +

“/ClientBin/NonStandBusPurchaseReqsSLOM.xap”;

slhc.InitParameters = “url=” + SPContext.Current.Web.Url;

this.Controls.Add(slhc);

}

}

}

12中的代码创建了一个SilverlightObjectTagControl实例,将Source属性设为在ClientBin
中的Silverlight应用程序URL,并设置InitParameter来保存现有站点的URL(非标准业务购买请求列表可在此找到)。要将URL传递到NonStandBusPurchaseReqsSLOM中的MainPage类构造器中,打开App.xaml.cs,并为Application_Startup事件添加以下代码:

private void
Application_Startup(object sender,

StartupEventArgs e)

{

string
url = e.InitParams[“url”];

this.RootVisual
= new MainPage(url);

}

若要测试Web Part ,将PurchasingMgr.wsp包部署到内部部署的Purchasing站点来部署非标准业务购买请求列表(该列表在之前提到的调试阶段结束的时候被移除),然后从Visual
Studio 2010中调试PurchasingMgrWP解决方案。当Web 部件被添加到\Purchasing\Home.aspx中时,它允许我将项目从Silverlight直接添加到列表中,如1314所示

13 运行中的NonStandBusPurchaseReqsWP

14 更新后的非标准业务购买请求列表

开发和调试内部部署站点使我能使用Visual
Studio 2010来同时调试SharePointSilverlight 4,直到我将解决方案全部测试完毕为止。这时,我会上传PurchasingMgrWP.wspSharePoint Online的解决方案库中。

SharePoint客户端OM提供了我们所熟悉而统一的面向对象的API来访问SharePoint Online的列表和库。此APIMicrosoft.SharePoint API的一个子集,并限于站点集及更小的范围,这点与SharePoint
Online的开发要求很完美达统一起来。

云中的SharePoint解决方案

总的来说,SharePoint Online为开发者提供了一个独特的机会来运用他们已有的技术和工具去构建面向云的SharePoint解决方案。通过了解SharePoint Online自定义功能(包括支持和不支持哪些内容),沙盒解决方案,SharePoint客户端OMSharePoint Designer 2010构建的声明性工作流,您可以使用SharePoint Online生成可在云运行的SharePoint解决方案。在测试版本过程中,如您欲了解更多的SharePoint Online的开发信息,请查看SharePoint
Online Developer资源中心
msdn.com/sharepointonline)